Скрыть пользовательскую кнопку действия при нажатии, отображающую текст в списке заказов администратора WooCommerce

#php #wordpress #woocommerce #backend #orders

#php #wordpress #woocommerce #серверная часть #заказы

Вопрос:

Я создаю плагин woocommerce для отправки деталей заказа через WhatsApp. Вот мой код плагина

 add_filter( 'manage_edit-shop_order_columns', 'dvs_whatsapp_msg_list_column' );
function dvs_whatsapp_msg_list_column( $columns ) {
    $columns['dvs_show_whatsapp'] = 'WhatsApp';
    return $columns;
}
 
add_action( 'manage_shop_order_posts_custom_column', 'dvs_whatsapp_msg_list_column_content' );
function dvs_whatsapp_msg_list_column_content( $column ) {
    global $post;
    if ( 'dvs_show_whatsapp' === $column ) {
        $order = wc_get_order( $post->ID );
        $firstname = $order->get_billing_first_name();
        $lastname = $order->get_billing_last_name();
        $phone = $order->get_billing_phone();
        $ordernum = $order->get_order_number();
        $total = $order->get_total();
        $payment = $order->get_payment_method_title();
        $country = $order->get_billing_country();
        $calling_code = WC()->countries->get_country_calling_code($country);
        $whatsappnum = $calling_code.$phone;

        $msg = 'Hello ' .$firstname. ' ' .$lastname. ', your order #' .$ordernum. ' has been received. The order amount is ' .$total. '. Your payment method is ' .$payment.  '. Please contact us if you have any question regarding your order. Thank you.';
        
echo '<a href="https://wa.me/' .$whatsappnum. '?text=' .urlencode($msg).'" target="blank" class="dvs-whatsapp-btn">Send WhatsApp</a>';
    }
}
  

Это вывод
введите описание изображения здесь

Я хочу, чтобы, когда менеджер магазина или администратор нажимали ссылку «Отправить WhatsApp», она скрывала ссылку и показывала отправленное сообщение, чтобы менеджер магазина или администратор могли знать, что детали этого сообщения уже отправлены.

Пожалуйста, помогите.

Комментарии:

1. Я бы предложил обновлять мету заказа через AJAX при нажатии на ссылку. Сохраняем что-то вроде whatsapp_link_sent: 1 в мете заказа. Затем основывайте выходные данные в своем столбце на этом значении.

2. @Terminator-Barbapapa ваша точка зрения в действительном sir, это должно быть похоже на update_post_meta ($order->id, ‘_dvs_whatsapp_order_link’, ‘1’); и затем в функции я могу использовать условие, но как обновить post_meta при нажатии на ссылку?

3. Вы можете использовать jQuery для определения момента нажатия на ссылку и запуска AJAX-вызова, который обновит мету заказа и изменит вашу ссылку на «Отправленную ссылку» с помощью функции обратного вызова. Проверьте документацию WordPress по использованию AJAX в плагинах .

Ответ №1:

Javascript — это не способ достичь этого. Вместо этого вы будете использовать следующее, чтобы скрыть ссылку и отобразить «Отправленное сообщение» после нажатия на внешнюю ссылку:

 add_filter( 'manage_edit-shop_order_columns', 'dvs_whatsapp_msg_list_column' );
function dvs_whatsapp_msg_list_column( $columns ) {
    $columns['whatsapp'] = __('WhatsApp', 'woocommerce');
    return $columns;
}

add_action( 'manage_shop_order_posts_custom_column', 'dvs_whatsapp_msg_list_column_content' );
function dvs_whatsapp_msg_list_column_content( $column ) {
    if ( 'whatsapp' === $column ) {
        global $the_order;

        if( ! $the_order->get_meta('_wapp_sent') ) {
            echo '<a href="?post_type=shop_orderamp;send=dvs_whatsappamp;order_id=' . $the_order->get_id() .' target="blank" class="dvs-whatsapp button">' . __("Send WhatsApp") . '</a>';
        }
        else {
            echo __("Message sent", "woocommerce");
        }
    }
}

add_action( 'admin_init', 'dvs_redirect_whatsapp_send' );
function dvs_redirect_whatsapp_send() {
    global $pagenow;

    # Check current admin page.
    if ( $pagenow == 'edit.php' amp;amp; isset($_GET['post_type']) amp;amp; $_GET['post_type'] == 'shop_order'
    amp;amp; isset($_GET['send']) amp;amp; $_GET['send'] == 'dvs_whatsapp' amp;amp; isset($_GET['order_id']) amp;amp; $_GET['order_id'] > 0 ) {
        $order = wc_get_order( $_GET['order_id'] );

        $msg = sprintf( __("Hello %s %s, your order #%s has been received. The order amount is %s. Your payment method is %s. %s", "woocommerce"),
            $order->get_billing_first_name(),
            $order->get_billing_last_name(),
            $order->get_order_number(),
            $order->get_total(),
            $order->get_payment_method_title(),
            __("Please contact us if you have any question regarding your order. Thank you.", "woocommerce")
        );

        $whatsapp_num = WC()->countries->get_country_calling_code( $order->get_billing_country() ) . $order->get_billing_phone();

        update_post_meta( $_GET['order_id'], '_wapp_sent', 'true' ); // Mark order as WhatsApp message sent

        wp_redirect( 'https://wa.me/' . $whatsappnum . '?text=' . urlencode($msg) ); // Redirect to WhatsApp sending service
        exit;
    }
}
  

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

Комментарии:

1. Спасибо, код идеален. И последнее, можем ли мы открыть ссылку WhatsApp в новой вкладке? например, targer=»пустой»

2. Спасибо, я добавил это. Ваши навыки великолепны, сэр, если ( ! $the_order-> get_meta(‘_wapp_sent’)) { echo ‘<a href=»?post_type=shop_orderamp;send=dvs_whatsappamp;order_id=’ . $the_order->get_id() .'» class=»dvs-whatsapp-btn» target=»пустой» style=»ширина: 100%; текст- выровнять: по центру; граница: 1px сплошная #53c661; отступ: 5px 10px; радиус границы: 5px; фон: #53c661; цвет: #fff;»>’ . __(«Отправить WhatsApp») . ‘</a>’;

Ответ №2:

Я считаю, что это должно сработать:

jQuery для вставки на вашу страницу

 jQuery('.dvs-whatsapp-btn').click(function(){
    jQuery('<span class="link-clicked">Link clicked!</span>').insertAfter('.dvs-whatsapp-btn');
    jQuery('.dvs-whatsapp-btn').hide();
});
  

Комментарии:

1. нет, сэр, он отображает это: i.imgur.com/3MNdPxm.png а также, когда мы обновляем страницу, на ней снова отображается ссылка «Отправить WhatsApp».

2. Если вы хотите, чтобы на странице ВСЕГДА указывалось, что ссылка была нажата после того, как она была нажата (и не изменялась при обновлении), тогда вы смотрите на что-то совершенно отличное от того, что я отправил… Вам нужно будет добавить много пользовательского PHP, новый столбец базы данных и функцию для обработки ввода со страницы. Таким образом, в этом случае вы вообще не смотрите на jQuery, скорее на что-то вроде этого (пользовательский обработчик ввода страницы администратора WordPress). К сожалению, это выходит за рамки stackexchange.