Как получить слаг сообщения пользовательского типа?

Мне нужно добавить формы заказа для существующего веб-сайта Wordpress. После выбора проекта на главной странице пользователь будет перенаправлен на форму заказа для этого проекта. Теперь вот проблема: форма заказа должна быть автоматически заполнена / автоматически заполнена записями, если пользователь ранее сделал заказ для этого проекта.

Я сделал формы с помощью Ninja Forms и сделал собственный плагин для функции автозаполнения. Вот часть кода пользовательского плагина, который я написал:

<?php
/*
...
*/

global $my_custom_plugin_table_version;
$my_custom_plugin_table_version = '1.0';  // table version if need to update

register_activation_hook( __FILE__, 'custom_plugin_create_db' );
function custom_plugin_create_db() {
    global $wpdb;
    global $my_custom_plugin_table_version;

    $table_name = $wpdb->prefix . "my_custom_plugin_table";
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        order_id VARCHAR(140) NOT NULL,
        user_company VARCHAR(250) NOT NULL,
        user_name VARCHAR(250) NOT NULL,
        user_address VARCHAR(255) NOT NULL,
        user_city VARCHAR(50) NOT NULL,
        user_state VARCHAR(50) NOT NULL,
        user_zip VARCHAR(50) NOT NULL,
        user_phone VARCHAR(50) NOT NULL,
        user_email VARCHAR(50) NOT NULL,
        order_quantity INT(11) NOT NULL,
        PRIMARY KEY  (order_id) 
    ) $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );

    add_option( 'my_custom_plugin_table_version', $my_custom_plugin_table_version );
}

function custom_plugin_autofill_form( $default_value, $field_type, $field_settings ) {
    $form_id = 3;
    $models = Ninja_Forms()->form( $form_id )->get_subs();
    $id = current( $models )->get_id();
    $sub = Ninja_Forms()->form()->get_sub( $id );

    foreach ( $sub->get_field_values() as $key => $value ) {
        if ( $field_settings['key'] == $key ) {
            $default_value = $value;
        }
    }

    return $default_value;
}

add_action( 'init', 'check_for_previous_order' );
function check_for_previous_order() {
    global $wpdb;

    $table_name = $wpdb->prefix . "my_custom_plugin_table";
    $user_id = get_current_user_id();
    $project_name = 'project-1';
    $order_id = $project_name . '-' . $user_id;

    $result = $wpdb->get_row( "SELECT * FROM $table_name WHERE order_id = '$order_id'" );

    if ( $result != NULL )
        add_filter( 'ninja_forms_render_default_value', 'custom_plugin_autofill_form', 10, 3 );
}

do_action( 'check_for_previous_order' );

add_action( 'ninja_forms_after_submission', 'custom_plugin_save_db' );
function custom_plugin_save_db( $form_data ) {
    global $wpdb;
    $table_name = $wpdb->prefix . "my_custom_plugin_table";
    $submitted_data = [];

    foreach ( $form_data[ 'fields' ] as $field ) {
        $key = $field[ 'key' ];
        $value = $field[ 'value' ];
        $submitted_data[ $key ] = $value;
    }

    $wpdb->replace( $table_name, array(
        'order_id' => $submitted_data[ 'order_project_id' ] . '-' . get_current_user_id(),
        'user_company' => $submitted_data[ 'user_company' ],
        'user_name' => $submitted_data[ 'user_name' ],
        'user_address' => $submitted_data[ 'user_address' ],
        'user_city' => $submitted_data[ 'user_city' ],
        'user_state' => $submitted_data[ 'user_state' ],
        'user_zip' => $submitted_data[ 'user_zip' ],
        'user_phone' => $submitted_data[ 'user_phone' ],
        'user_email' => $submitted_data[ 'user_email' ],
        'order_quantity' => $submitted_data[ 'order_quantity' ]
    ) );
}

Он прослушивает форму NF и сохраняет значения в таблице после отправки. И когда отображается форма NF, она проверяет базу данных на наличие любой предыдущей записи. Я завернул функцию check_for_previous_order в действие, чтобы функция get_current_user_id работала.

Как видите, я сохранил каждый предыдущий заказ, применив order_id, который представляет собой просто комбинацию имени проекта и текущего идентификатора пользователя. Проблема в их извлечении. Я написал только $project_name и $form_id в коде, но мне нужно, чтобы они были динамическими. Я создал проект пользовательского типа публикации для проектов, и каждый проект является публикацией проекта. Имя проекта — это слаг сообщения. Но я не могу понять, как получить слизняка.

Я пробовал глобальный метод $post. Он возвращает NULL. global $pagenow возвращает index.php.


person johnjullies    schedule 10.07.2017    source источник


Ответы (1)


я не думаю, что объект $post установлен до вызова хуков add_action('init');.

вы можете попробовать изменить это на add_action('template_redirect', 'check_for_previous_order');

<?php
add_action( 'template_redirect', 'check_for_previous_order' );
function check_for_previous_order() {
    global $wpdb;
    global $post;
    echo $post->ID;
    //...
}
?>

чтобы вызвать это только для страниц с формой с легким доступом к идентификаторам формы, вы можете попробовать заменить add_action('template_redirect','check_for_previous_order') на это:

<?php
function check_for_previous_order($form_id) {

    //form id comes in as an argument now
    global $post;

}
add_action('ninja_forms_display_init', 'check_for_previous_order', 10, 1);
?>
person Joel Glovacki    schedule 10.07.2017
comment
О, так вот почему $post возвращается NULL! Спасибо вам за это. Теперь мне просто нужно получить идентификатор формы... - person johnjullies; 10.07.2017
comment
@johnjullies следите за действием ninja_forms_display_init. - person Joel Glovacki; 10.07.2017
comment
@johnjullies я обновлю свой ответ примером, который должен помочь - person Joel Glovacki; 10.07.2017
comment
где ты нашел ninja_forms_display_init? И как мне интегрировать его в мою функцию autofill_form? - person johnjullies; 10.07.2017
comment
Теперь, когда я проверил, очевидно, замена 'template_redirect' на 'ninja_forms_display_init' не работает. - person johnjullies; 10.07.2017
comment
ой, извините, я все еще использую формы ниндзя 2.x. похоже, что ninja_forms_display_init был удален из документации веб-сайта и версии 3. - person Joel Glovacki; 10.07.2017