Индекс массива отправки Woocommerce как значение при отправке заказа - PullRequest
2 голосов
/ 25 сентября 2019

Я пытался добавить настраиваемое поле «Выбрать» в кассу woocommerce.Опции выбора состоят из записей в массиве, который, в свою очередь, состоит из заголовков и дат из запроса пользовательских типов записей.

Все это отлично работает, я могу добавлять новые пользовательские сообщения, а также заголовок и датыобъединяются, добавляются в массив и, в свою очередь, добавляются в раскрывающийся список выбора на кассе, однако, когда я отправляю форму и выполняю заказ, в метаданные добавляется индекс выбранного значения поля выбора, а не значение.

Я добавил сюда изображения, чтобы показать вам, что я имею в виду.например, если я выберу третий вариант в раскрывающемся списке «Рынок фермеров Тэйна», который представляет собой индекс массива 2 , это то, что сохраняется для мета ордера вместо значения в этой записи индекса.

снимок экрана содержит результаты дампа var, показывающего содержимое массива, а также поле выбора под ним.

изображение того, как массив отображается в var dump мета порядка, отображаемая на экране администратора, показывающая индекс, а не значение

ВотВ моем коде, охватывающем этот раздел, любые указатели были бы очень полезны.Я чувствую, что, возможно, есть какое-то простое решение, чтобы получить значение по выбранному индексу при обработке заказа?

/**
* Add custom Pickup Field field to the checkout page
*/
add_filter( 'woocommerce_after_order_notes', 'hiwoo_add_checkout_fields' );
function hiwoo_add_checkout_fields( $checkout ) {

  $args = array(
    'post_type'         => 'pickup-point',
    'posts_per_page'    => -1,
    'post_status'       => 'publish'
    );

// Custom query to pull in the pickup points.
$query = new WP_Query( $args );

$pickup_comb_option = [];

while ($query->have_posts()) {
    $query->the_post();

    $postid = $post->ID;
    $pickuptitle = get_the_title($post);
    $pickupdate = get_post_meta(get_the_id($post), 'available_date', true);

    $pickupoption = $pickuptitle . ' - ' . $pickupdate;
    array_push($pickup_comb_option, $pickupoption);
}

var_dump($pickup_comb_option);

// Restore original post data.
wp_reset_postdata();


echo '<div id="custom_checkout_field"><h2>' . __('Order Pickup Location/Date') . '</h2>';

 woocommerce_form_field( 'pickup_point_options', array(
        'type' => 'select',
        'class' => array(
        'my-field-class form-row-wide'
            ) ,
        'label' => __('Select Pickup Location/Date') ,
        'placeholder' => __('Pickup Point') ,
        'options' => $pickup_comb_option,
        ), 
        $checkout->get_value( 'pickup_point_options' ));

echo '</div>';

} /* Close custom field function */

/**
 * Process the checkout
 */
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['pickup_point_options'] )
        wc_add_notice( __( 'Please select a pickup location from the list.' ), 'error' );
}

/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );

function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['pickup_point_options'] ) ) {
        update_post_meta( $order_id, 'Pickup Location/Date', sanitize_text_field( $_POST['pickup_point_options'] ) );
    }
}

/**
 * Display field value on the order edit page
 */
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );

function my_custom_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('Pickup Location/Date').':</strong> ' . get_post_meta( $order->id, 'Pickup Location/Date', true ) . '</p>';
}

HTML-код, созданный на странице оформления заказа для поля выбора:

array(3) {
  [0]=>
  string(32) "Tain Farmers Market - 2019-12-25"
  [1]=>
  string(30) "Hi Create Offices - 2019-10-25"
  [2]=>
  string(27) "Dornoch Stores - 2019-09-26"
}


<select name="pickup_point_options" id="pickup_point_options" class="select " data-placeholder="Pickup Point">
    <option value="0">Tain Farmers Market - 2019-12-25</option>
    <option value="1">Hi Create Offices - 2019-10-25</option>
    <option value="2">Dornoch Stores - 2019-09-26</option>
</select>

1 Ответ

2 голосов
/ 25 сентября 2019

В соответствии с вашим HTML я предполагаю, что в вашем примере значение «2» вместо «Tainy Farmers Market», верно?Если это так, это технически правильно, поскольку значение <select>, отправляемое при отправке формы, всегда является значением в атрибуте значения параметра (<option value="2">), а не текстом между (<option value="2">Some text</option>)

Чтобы сохранить текст между, он должен быть установлен внутри атрибута значения.Для этого вам нужно изменить массив параметра с числового на ассоциативный, например, так:

$pickup_comb_option = [];

while ($query->have_posts()) {
    $query->the_post();

    // ...
    // change this line
    array_push($pickup_comb_option, $pickupoption); 
    // to:
    $pickup_comb_option[$pickupoption] = $pickupoption;
}

Чтобы проверить эту сработавшую проверку для сгенерированного HTML, он должен выглядеть примерно так:

<select>
   <option value="Tain Farmers Market">Tain Farmers Market</option>
</select>

@ edit Я должен отметить, что у этого подхода есть некоторые недостатки: вы должны убедиться, что строка в $pickupoption не используется несколько раз.Также необходимо, чтобы строка была допустимой для использования в качестве ключа массива (не NULL, не пустой).Поскольку значение записывается внутри html-атрибута (value="$arrKey"), вы также можете проверить, как Woocommerce обрабатывает такие вещи, как двойные кавычки внутри строки.Просто чтобы заранее избежать возможных ошибок.

Альтернативным подходом может быть сохранение идентификатора вместо строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...