仅在特定页面上使用wc_enQueue_js-嵌套的Add_action

时间:2019-08-14 作者:Ryszard Jędraszyk

在我的插件中,我尝试使用wc_enqueue_js 仅在购物车页面上。插件的其余部分也仅在购物车页面上执行。

下面的代码工作正常,但我不喜欢需要重复的事实if (! is_cart() ) return;. 这看起来可能不是什么大问题,但我的另一个有类似问题的插件根据用户在插件设置中选择的内容有几行条件,这些条件与多个操作混合在一起:

// Run plugin.
add_action( \'template_redirect\', function() use ( $args ) { ajax_cart_autoupdate( $args ); });
function ajax_cart_autoupdate( $args ) {    
    if (! is_cart() ) return; // Only if it\'s a cart page.  
    // Do stuff.    
}

// Enqueue js script inline using wc_enqueue_js.
add_action( \'template_redirect\', function() use ( $args ) { acau_enqueue_script ( $args ); });
function acau_enqueue_script( $args ) { 
    if (! is_cart() ) return; // Only if it\'s a cart page.  
    wc_enqueue_js( \'    
        <<<my jquery code>>>
    \' );    
}
以下操作无效-内联脚本不会显示在HTML中:

// Run plugin.
add_action( \'template_redirect\', function() use ( $args ) { ajax_cart_autoupdate( $args ); });
function ajax_cart_autoupdate( $args ) {
    if (! is_cart() ) return; // Only if it\'s a cart page.
    // Enqueue js script inline using wc_enqueue_js.
    add_action( \'template_redirect\', function() use ( $args ) { acau_enqueue_script ( $args ); });
    // Do stuff.    
}

function acau_enqueue_script( $args ) { 
    wc_enqueue_js( \'    
        <<<my jquery code>>>
    \' );    
}
下面的操作正常,但内联脚本在HTML中出现了两次(一个脚本直接位于另一个脚本的下方)。如果我把echo \'test\'; 在函数的第一行中acau_enqueue_script, 它只在页面上出现一次:

// Run plugin.
add_action( \'template_redirect\', function() use ( $args ) { ajax_cart_autoupdate( $args ); });
function ajax_cart_autoupdate( $args ) {
    if (! is_cart() ) return; // Only if it\'s a cart page.
    // Enqueue js script inline using wc_enqueue_js.
    add_action( \'wp_enqueue_script\', function() use ( $args ) { acau_enqueue_script ( $args ); });
    // Do stuff.    
}

function acau_enqueue_script( $args ) { 
    wc_enqueue_js( \'    
        <<<my jquery code>>>
    \' );    
}
有没有什么聪明的方法可以让它在不重复页面条件的情况下工作?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

不知道为什么,但对于第二个代码段,更改嵌套add_action 从默认值(10)到20,导致父级和子级add_action 以不同的优先级解决问题,现在一切都很好:add_action( \'template_redirect\', function() use ( $args ) { acau_enqueue_script ( $args ); }, 20);

原因很简单。因为WordPress支持嵌套挂钩,这意味着您可以向同一个/父挂钩添加另一个回调(例如。template_redirect 如果优先级大于父回调的优先级,则会调用附加回调。

案例1:在这种情况下,只有some_func2() 这将被执行。因为它的优先级是12, 大于父回调(即闭包)。

add_action( \'template_redirect\', function(){
    add_action( \'template_redirect\', \'some_func\', 11 );  // first child hook
    add_action( \'template_redirect\', \'some_func2\', 12 ); // second child hook
}, 11 ); // parent hook
some_func() 和some_func2() 将被执行。因为它们的优先级再次大于父回调的优先级。

add_action( \'template_redirect\', function(){
    add_action( \'template_redirect\', \'some_func\', 11 );  // first child hook
    add_action( \'template_redirect\', \'some_func2\', 12 ); // second child hook
} ); // parent hook with the default priority (10)

使用嵌套钩子的替代方法,因此这是关于wc_enqueue_js() 仅在购物车页面上

你可以试试其中一种,它对我很有效:

钩住wp, 然后挂钩acau_enqueue_script()template_redirect:

add_action( \'wp\', function(){
    if ( is_cart() ) {
        add_action( \'template_redirect\', \'acau_enqueue_script\' );
    }
} );
template_redirect, 然后挂钩acau_enqueue_scriptwp_footer (WooCommerce使用此挂钩打印通过wc_enqueue_js()):

add_action( \'template_redirect\', function(){
    if ( is_cart() ) {
        add_action( \'wp_footer\', \'acau_enqueue_script\' );
    }
} );

相关推荐

如何在WordPress的函数中使用PHPmaizer

我在WordPress函数中有一个函数。php文件,它在用户元中搜索条件,并根据找到的内容向用户发送电子邮件。我目前使用wp\\u mail()发送电子邮件,这很有效。但是,我想使用包含的PHPMailer类来完成这项工作,以便可以通过SMTP发送消息。我想我有一个解决方案:https://codex.wordpress.org/Plugin_API/Action_Reference/phpmailer_init, 然而,这似乎只适用于系统生成的消息,而不适用于自定义消息。此时我只是猜测,但我尝试了这个,