首页 > 解决方案 > 在通过 hook/php 加载 Woocommerce 感谢页面的内容后,有什么方法可以运行代码?

问题描述

我有一个函数可以获取超过 2000 多个 Mailchimp 联系人,所以运行这个查询和做其他一些事情需要将近 30 秒的时间,这个查询是在从结帐页面下订单后运行的。

但是我想做的是,一旦感谢页面完全加载,就需要运行 Mailchimp 联系人查询,否则现在加载感谢页面需要 30 秒的时间,这对用户不友好. 但是只有在加载感谢页面内容之后,我没有任何方法来运行该功能,而不是在它之前。

我目前正在使用这个钩子

woocommerce_thankyou

提前致谢!

标签: wordpresswoocommercehook-woocommercemailchimp

解决方案


您可以使用woocommerce_thankyou在内容加载后调用的操作挂钩。检查下面的代码。代码将转到活动主题 funcions.php 文件。

add_action( 'woocommerce_thankyou', 'run_mailchimp_query' );
function run_mailchimp_query( $order_id ) {
    // your mailchimp code.
}

您还可以使用wp_footer操作挂钩。

add_action( 'wp_footer', 'run_mailchimp_query' );
function run_mailchimp_query() {
    
    // returm early if is not on the Thank you page.
    if( !is_wc_endpoint_url( 'order-received' ) ) return;

    // your mailchimp code.
    
}

此外,您可以使用AJAX

add_action( 'woocommerce_thankyou', 'run_mailchimp_query' );
function run_mailchimp_query( $order_id ) {
    ?>
    <script type="text/javascript">
        (function($){
            $(document).ready(function(){
                $.ajax({
                    url: '<?php echo admin_url('admin-ajax.php'); ?>',
                    type : 'post',
                    data: {
                        'action' : 'run_mailchimp_query'
                        'order_id': '<?php echo $order_id; ?>'
                    },
                    success: function( data) {
                        
                    }
                });
            });
        })(jQuery);
    </script>
    <?php
}

add_action("wp_ajax_run_mailchimp_query", "run_mailchimp_query");
add_action("wp_ajax_nopriv_run_mailchimp_query", "run_mailchimp_query");
function run_mailchimp_query(){

    $order_id = $_POST['order_id'];

    create_coupon_based_on_user_registration( $order_id );

    wp_send_json_success();

}

您也可以使用 CRON 作业,然后获取所有订单。最好create_coupon_based_on_user_registration在 cron 作业中运行。

function add_five_minute_cron_schedules($schedules){

    if( !isset( $schedules["five_minute"] ) ){
        $schedules["five_minute"] = array(
            'interval' => 5*60,
            'display'  => __('Once every 5 minutes')
        );
    }

    return $schedules;
}
add_filter('cron_schedules','add_five_minute_cron_schedules');

if( ! wp_next_scheduled( 'create_coupon_based_on_user_registration_cron' ) ){
    wp_schedule_event( time(), 'five_minute', 'create_coupon_based_on_user_registration_cron' );
}
    
//Hook into that action that'll fire every 5 minutes.
add_action( 'create_coupon_based_on_user_registration_cron', 'create_coupon_based_on_user_registration_callback' );

function create_coupon_based_on_user_registration_callback(){

    $args = array(
        'post_status'    => array( 'wc-processing' ),
        'posts_per_page' => -1,
        'meta_key'       => 'coupon_created',
        'meta_compare'   => 'NOT EXISTS'
    );
    
    $orders = wc_get_orders($args);

    if( !empty( $orders ) ){

        // Loop through each $order objects.
        foreach( $orders as $order ){
            
            $order_id = method_exists( $order, 'get_id' ) ? $order->get_id() : $order->id;

            create_coupon_based_on_user_registration( $order_id );

            update_post_meta( $order_id, 'coupon_created', 1 );

        }   

    }

}

推荐阅读