Добавить настраиваемое поле оформления заказа в WooCommerce

Обновление WooCommerce 3.0 мне не понравилось. Я добавил настраиваемое обязательное поле для оформления заказа на доменное имя, и мне сложно понять, как его сохранить сейчас. Этот код еще правильно добавляет поле:

add_action( 'woocommerce_after_order_notes', 'add_domain_checkout_field' );

function add_domain_checkout_field( $checkout ) {

    echo '<div id="add_domain_checkout_field"><h2>' . __('Domain') . '</h2>';

    woocommerce_form_field( 'sitelink_domain', array(
        'type'          => 'text',
        'required' => true,
        'class'         => array('my-field-class form-row-wide'),
        'label'         => __('Domain where SiteLink will be installed'),
        'placeholder'   => __('Enter your URL'),
        ), $checkout->get_value( 'sitelink_domain' ));

    echo '</div>';

}

И я пытаюсь сохранить это так:

add_action( 'woocommerce_checkout_create_order', 'add_domain_to_order_meta', 10, 2 );
function add_domain_to_order_meta( $order, $data ) {
    if ( ! empty( $_POST['sitelink_domain'] ) ) {
        $order->add_meta_data( 'ssla_sitelink_url', sanitize_text_field( $_POST['sitelink_domain'] ) );
    }
}

Однако мета, похоже, нигде не добавляется или не сохраняется.

Я знаю, что там есть переменная $_POST, я выписал ошибку, чтобы посмотреть.

Тестирование некоторых захватов и регистрации ошибок еще больше сбивает меня с толку:

$sitelink_domain        = $subscription->get_meta_data( 'ssla_sitelink_url' );
error_log( print_r(  $sitelink_domain, true ) );

// Вывод:

[21-Apr-2017 01:26:27 UTC] Array
(
    [0] => stdClass Object
        (
            [id] => 270086
            [key] => _ssla_sitelink_url
            [value] => lololol.com
        )

    [1] => stdClass Object
        (
            [id] => 270089
            [key] => _download_permissions_granted
            [value] => 1
        )

)

Тем не мение,

$sitelink_domain        = $subscription->get_meta( 'ssla_sitelink_url' );
error_log( 'Domain: ' . $sitelink_domain );

Вывод просто:

[21-Apr-2017 01:27:39 UTC] Domain:

person thatryan    schedule 21.04.2017    source источник
comment
Как вы инициализируете $subscription? Помните, что порядок подписки и порядок не совпадают, даже если у них много общих данных.   -  person helgatheviking    schedule 21.04.2017
comment
Подписка проходит через ловушку, которую я использую, woocommerce_subscription_status_updated, и похоже, что по какой-то причине add_meta_data() ставит перед ключом символ подчеркивания? Я попробовал $subscription->get_meta( '_ssla_sitelink_url' ); и он нормально тянет ...   -  person thatryan    schedule 21.04.2017


Ответы (2)


Сначала вам нужно проверить поле, когда форма оформления заказа размещена, и поле является обязательным, а не необязательным, с помощью ловушки действия woocommerce_checkout_process:

add_action('woocommerce_checkout_process', 'domain_checkout_field_process');
function domain_checkout_field_process() {
    // Check if it's set and if it's not set, we add an error.
    if ( ! $_POST['sitelink_domain'] )
        wc_add_notice( __( 'Please enter the domain where the SiteLink will be installed.' ), 'error' );
}

Поскольку это настраиваемое поле оформления заказа, вы можете использовать перехватчик действия woocommerce_checkout_update_order_meta, чтобы сохранить новое поле для упорядочивания настраиваемых полей:

add_action( 'woocommerce_checkout_update_order_meta', 'domain_checkout_field_update_order_meta' );

function domain_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['sitelink_domain'] ) ) {
        update_post_meta( $order_id, 'ssla_sitelink_url', sanitize_text_field( $_POST['sitelink_domain'] ) );
    }
}

Используйте обработчик действия woocommerce_admin_order_data_after_billing_address, чтобы отобразить значение настраиваемого поля на странице редактирования заказа администратора:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'domain_checkout_field_display_admin_order_meta', 10, 1 );
function domain_checkout_field_display_admin_order_meta($order){
    // Get the custom field value
    $domain_siteLink = get_post_meta( $order->get_id(), 'ssla_sitelink_url', true );
    // Display the custom field:
    echo '<p><strong>' . __('Domain SiteLink', 'woocommerce') . ': </strong>' . $domain_siteLink . '</p>';
}

Отображение метки и значения настраиваемого поля в заказах внешнего интерфейса и уведомлениях по электронной почте:

add_action( 'woocommerce_order_item_meta_end', 'custom_custom', 10, 3 );
function custom_custom( $item_id, $item, $order ){
    // Get the custom field value
    $domain_siteLink = get_post_meta( $order->get_id(), 'ssla_sitelink_url', true );
    // Display the custom field:
    echo '<p><strong>' . __('Domain SiteLink', 'woocommerce') . ': </strong>' . $domain_siteLink . '</p>';
}

Этот код находится в файле function.php вашей активной дочерней темы (или темы) или также в любом файле плагина.

Этот код работает для WooCommerce 3.0+

person LoicTheAztec    schedule 21.04.2017
comment
Здравствуйте, @LoicTheAztec, сэр. Есть ли способ предотвратить сохранение нового заказа для определенного идентификатора клиента, у меня есть список идентификаторов клиентов из черного списка, и я хочу показать настраиваемую ошибку, когда администратор выбирает клиента из черного списка и нажимает на сохранение заказа, затем показывает сообщение об ошибке вместо размещения заказа, но woocommerce_checkout_process и другие крючки, которые я пробовал, не работают - person Kamalesh M. Talaviya; 25.10.2020
comment
@ KamaleshM.Talaviya Да, это возможно ... Задайте новый вопрос, предоставив код, который вы пробовали, с пояснениями, а затем сообщите мне здесь. - person LoicTheAztec; 25.10.2020
comment
Здравствуйте, @LoicTheAztec, сэр. Я создал новый вопрос с подробностями. Все, что мне нужно знать, это имя backend-хука, где я могу проверить условия и вернуть сообщение об ошибке. Будет здорово, если вы поможете мне с этим спасибо. stackoverflow.com/questions/64525494/ - person Kamalesh M. Talaviya; 25.10.2020

Вы можете добавить дополнительные метаданные заказа, как показано ниже.

add_action('woocommerce_add_order_item_meta','add_values_to_order_item_meta',1,2);
if(!function_exists('add_values_to_order_item_meta'))
{
  function add_values_to_order_item_meta($item_id, $values)
  {
        global $woocommerce,$wpdb;
        $user_custom_values = $values['user_custom_data_value'];
        if(!empty($user_custom_values))
        {
            wc_add_order_item_meta($item_id,'user_custom_data',$user_custom_values);  
        }
  }
}
person mujuonly    schedule 21.04.2017
comment
Неясно, нужна ли OP мета элемента заказа или мета обычного заказа, но этот подход добавит user_custom_data_value к каждому заказываемому продукту. Кроме того, вы можете очистить свой код, удалив глобальные переменные, которые вы не используете, и убрав проверку function_exists, поскольку нет необходимости проверять, существует ли она, когда вы определяете ее самостоятельно. - person helgatheviking; 21.04.2017