Отправить настраиваемое уведомление В Woocommerce редактировать страницу с повторением страниц заказа

Я создал плагин "уведомления по электронной почте для отслеживания заказов" для woocommerce. Все работает нормально, и когда я сохраняю номер для отслеживания, он отправляет электронное письмо клиенту.

Но когда я сохраняю другое поле на странице заказа, оно снова отправляет электронное письмо. Как я могу это исправить?

add_action('add_meta_boxes', 'kargo_takip');
function kargo_takip() {
    add_meta_box('kargo_takip_meta_box', 'Kargo Takip', 'kargo_takip_meta_box_ekle', 'shop_order', 'side', 'high');
}

function kargo_takip_meta_box_ekle() {
    global $post;

    $meta_field_data = get_post_meta($post->ID, '_kargo_takip', true) ? get_post_meta($post->ID, '_kargo_takip', true) : '';

    echo '
        <input type="hidden" name="kargo_takip" value="' . wp_create_nonce() . '">
        <p style="border-bottom:solid 1px #eee;padding-bottom:13px;">
        <input type="text" style="width:250px;";" name="kargo_takibi" placeholder="' . $meta_field_data . '" value="' . $meta_field_data . '"></p>
        ';
}

И я сохраняю трек-код вот так:

add_action('save_post', 'kargo_takip_kaydet', 10, 1);

function kargo_takip_kaydet($post_id) {

    if (!isset($_POST['kargo_takip'])) {
        return $post_id;
    }
    $nonce = $_REQUEST['kargo_takip'];

    if (!wp_verify_nonce($nonce)) {
        return $post_id;
    }

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }

    if ('page' == $_POST['post_type']) {

        if (!current_user_can('edit_page', $post_id)) {
            return $post_id;
        }
    } else {

        if (!current_user_can('edit_post', $post_id)) {
            return $post_id;
        }
    }

    $kargo_takip_no = $_POST['kargo_takibi'];

    $order     = wc_get_order($post_id);
    $useremail = $order->get_billing_email();

    update_post_meta($post_id, '_kargo_takip', $kargo_takip_no);
    wp_mail($useremail, "Your order picked up", "Your track code: " . $kargo_takip_no);
}

person bilimokur    schedule 19.01.2018    source источник


Ответы (1)


Обновление 2

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

Чтобы разрешить изменение кода отслеживания и отправку по электронной почте, мы сравним сохраненное значение с отправленным значением в качестве дополнительного условия (ИЛИ) в операторе if, проверяя, что отправленное значение не пустое.

Я полностью пересмотрел ваш код:

add_action('add_meta_boxes', 'kargo_takip');
function kargo_takip() {
    add_meta_box('kargo_takip_meta_box', 'Kargo Takip', 'kargo_takip_meta_box_ekle', 'shop_order', 'side', 'high');
}

function kargo_takip_meta_box_ekle( $post ) {
    $kargo_takip = get_post_meta( $post->ID, '_kargo_takip', true ); // Get the saved field value
    $value       = $kargo_takip ? $kargo_takip : ''; // Set the field value
    $pholder     = $kargo_takip ? '' : __('Enter the tracking number'); // The field placeholder
    ?>
    <p style="border-bottom:solid 1px #eee; padding-bottom:13px;">
        <input type="text" style="width:100%;" name="kargo_takibi" placeholder="<?php echo $pholder; ?>" value="<?php echo $value; ?>">
        <input type="hidden"  name="kargo_takibi_nonce" value="<?php echo wp_create_nonce(); ?>">
    </p>
    <?php
}

// Only for shop order
add_action('save_post_shop_order', 'kargo_takip_kaydet', 50, 3 );
function kargo_takip_kaydet( $post_id, $post, $update ) {
    // If our field is empty we exit
    if ( empty( $_POST['kargo_takibi'] ) )  return $post_id;

    $post_kargo_takibi = sanitize_text_field( $_POST['kargo_takibi'] ); // Posted field value
    $meta_kargo_takip = get_post_meta( $post_id, '_kargo_takip', true ); // Saved field value

    // Verify that the nonce is valid.
    if ( ! wp_verify_nonce( $_POST[ 'kargo_takibi_nonce' ] ) ) return $post_id;

    // Checking that is not an autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return $post_id;

    // Check the user’s permissions (for 'shop_manager' and 'administrator' user roles)
    if ( ! current_user_can( 'edit_shop_order', $post_id ) ) return $post_id;

    // If tracking code is not saved yet in database and tracking code field is not empty
    if ( ( $meta_kargo_takip != $post_kargo_takibi && $meta_kargo_takip && $post_kargo_takibi ) ||
       ( ! $meta_kargo_takip && $post_kargo_takibi ) )
    {
        // Customer billing email address
        $email = get_post_meta( $post_id, '_billing_email', true );
        // Send email
        wp_mail( $email, "Your order picked up", "Your track code: " . $post_kargo_takibi );
        // Save the Cargo tracking code data in database for this order
        update_post_meta( $post_id, '_kargo_takip', $post_kargo_takibi );
    }
}

Код находится в файле function.php активной дочерней темы (или активной темы).

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

person LoicTheAztec    schedule 19.01.2018
comment
спасибо, но он снова отправляет все отправленные по электронной почте. Не сработало :( - person bilimokur; 19.01.2018
comment
теперь он не сохраняет post_meta и не отправляет электронную почту. Не работает. - person bilimokur; 19.01.2018
comment
извини чувак. Это снова не работает. Он возвращает post all submit. И не сохранение post_meta. - person bilimokur; 20.01.2018
comment
@bilimokur Я вчера очень устал, но, пожалуйста, не называй меня чуваком. Я спокойно перепроверил и обновил это. Можешь попробовать… - person LoicTheAztec; 20.01.2018
comment
@LoizTheAztec, ладно, извини. Я обновил ваш код. Но это не сохранить и не отправить электронное письмо снова. Я попробовал, если $ _POST [kargo_takip] = post_meta вернет $ post_id, но снова не работает :) можем ли мы попробовать что-нибудь вроде этого? - person bilimokur; 20.01.2018
comment
ofc я заменил весь ваш код. Я не понимаю, почему не работает во мне. Спасибо вам за все. Я попробую сам. - person bilimokur; 20.01.2018
comment
@bilimokur Я думаю, что ответ другой (я больше не использую дополнительное мета-поле). Сделал продвинутую отладку и тесты. Вам следует попробовать этот новый код. Если это по-прежнему не работает, просто забудьте об этом. Также будет хорошо, если вы сможете удалить старые бесполезные комментарии. Спасибо. - person LoicTheAztec; 21.01.2018