Пользовательский выбор случайного выбора поля в Woocommerce - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть простой сайт WordPress, который использует WooCommerce.

Я хотел бы добавить функциональность на страницу / checkout пользовательского поля woocommerce. В идеале это поле будет иметь тип Select с несколькими параметрами. Это не проблема, так как я могу добавить приведенный ниже код в файл functions.php моей дочерней темы, чтобы создать это.

function customise_checkout_field($checkout)
{
// Heading for form
echo '<p>Custom Question Heading</p>';

woocommerce_form_field( 'questionOne', array(
    'type' => 'select',
    'class' => array( 'custom-dev-select'),
    'label' => 'This is the question',
    'options' => array(
        'blank' => 'Choose One',
        'value1' => 'Answer 1,
        'value2' => 'Answer 2
    ),
    'required' => true
    )
);

$checkout->get_value( $random_question );

}

Это создаст одну опцию выбора с вышеуказанными атрибутами.

Проблема в том, что я хотел бы сказать X3 из этих полей woocommerce_form_field, каждая из которых имеет свою метку / вопрос и разные варианты. Например;

Вопрос 1: Является ли яблоко a:

Вариант 1: Фрукты Вариант 2: мясо Вариант 3: Вег

Вопрос 2: Некоторый вопрос

Вариант 1: лорем Вариант 2: Lorem Вариант 3: Lorem

И затем каждый раз, когда страница загружается или обновляется и т. Д., Загружается другой вопрос.

Я попытался добавить несколько «woocommerce_form-field» в массив и использовать array_rand и т. Д., Однако это не работает. Вот пример кода, который у меня есть, который в настоящее время не работает, но вы понимаете, как бы я хотел, чтобы он работал.

function customise_checkout_field($checkout)
{
// Heading for form
echo '<p>Custom Question Heading</p>';

$questions = array(
    "question1" => array(
        "This is question one",
        "Choice 1",
        "Choice 2"
    ),

    "question2" => array(
        "This is question Two",
        "Choice 1.1",
        "Choice 2.1"
    ),

    "question3" => array(
        "label" => "This is question Three",
        "Choice 1.2",
        "Choice 2.2"
    ),
 );

$random_question = $questions[array_rand($questions)];


$selected_label = $random_question[0];
$selected_answer = $random_question[1];
$selected_answer2 = $random_question[2];


woocommerce_form_field( 'questionOne', array(
    'type' => 'select',
    'class' => array( 'custom-dev-select'),
    'label' => $selected_label,
    'options' => array(
        'blank' => 'Choose One',
        'value1' => $selected_answer,
        'value2' => $selected_answer2
    ),
    'required' => true
    )
);


$checkout->get_value( $random_question );
}
add_action('woocommerce_after_order_notes', 'customise_checkout_field');

Любая помощь будет принята с благодарностью. WordPress, woocommerce & php довольно новы для меня, так как это не мой основной язык для использования.

1 Ответ

0 голосов
/ 13 ноября 2018

Чтобы выбрать случайное извлечение поля (как случайный вопрос) с проверкой и сохранением данных в качестве метаданных пользовательского заказа, используйте следующее:

add_action( 'woocommerce_after_order_notes', 'custom_select_field_with_random_options', 10, 1 );
function custom_select_field_with_random_options( $checkout )
{
    // Heading for form
    echo '<h4>' . __("Custom Question Heading", "woocommerce") . '</h4>';

    $questions = array(
        '1' => array(
            'label'     => __("one", "woocommerce"),
            'options'   => array(
                'value1'    => __("Choice 1.1", "woocommerce"),
                'value2'    => __("Choice 1.2", "woocommerce"),
            ),
        ),
        '2' => array(
            'label'     => __("two", "woocommerce"),
            'options'   => array(
                'value1'    => __("Choice 2.1", "woocommerce"),
                'value2'    => __("Choice 2.2", "woocommerce"),
            ),
        ),
        '3' => array(
            'label'     => __("three", "woocommerce"),
            'options'   => array(
                'value1'    => __("Choice 3.1", "woocommerce"),
                'value2'    => __("Choice 3.2", "woocommerce"),
            ),
        ),
    );

    $key      = array_rand($questions); // Random key
    $question = $questions[$key]; // The question data array
    $label    = $question['label'];
    $default  = array( '' => __("Choose an answer", "woocommerce") );
    $options  = $default + $question['options'];

    woocommerce_form_field( 'question_'.$key, array(
        'type' => 'select',
        'class' => array( 'custom-dev-select'),
        'label' => __("This is the question", "woocommerce") . ' ' . $label,
        'options' => $options,
        'required' => true
    ), $checkout->get_value( 'question_'.$key ) );

    echo '<input type="hidden" name="question_key" value="'.$key.'">';
}

// Custom Checkout fields validation
add_action('woocommerce_checkout_process', 'custom_checkout_select_field_validation');
function custom_checkout_select_field_validation() {
    if ( isset($_POST['question_key']) ) {
        $key = esc_attr( $_POST['question_key'] );

        if ( isset($_POST['question_'.$key]) && empty($_POST['question_'.$key]) )
            wc_add_notice( '<strong>'. __("Please select a value", "woocommerce") . '</strong>', 'error' );
    }
}

// Save custom checkout fields the data to the order
add_action( 'woocommerce_checkout_create_order', 'custom_checkout_field_update_meta', 10, 2 );
function custom_checkout_field_update_meta( $order, $data ){
    if ( isset($_POST['question_key']) ) {
        $key = esc_attr( $_POST['question_key'] );

        if ( isset($_POST['question_'.$key]) && ! empty($_POST['question_'.$key]) ) {
            $order->update_meta_data( '_question_value', esc_attr( $_POST['question_'.$key] ) );
            $order->update_meta_data( '_question_key', $key );
        }
    }
}

// display the random question data in the order admin panel
add_action( 'woocommerce_admin_order_data_after_order_details', 'display_question_to_admin_order', 10, 1 );
function display_question_to_admin_order( $order ){
    if( $key = $order->get_meta( '_question_key' ) ) {
        if( $value = $order->get_meta( '_question_value' ) ) {
            echo '<br style="clear:both">
            <p><strong>' . __( "Random question", "woocommerce" ) . ' '. $key . ':</strong> ' . $value . '</p>';
        }
    }
}

Код помещается в файл function.php вашей активной дочерней темы (active theme). Проверено и работает.

...