我手边有一个问题。我在主题的functions.php中使用add_action('pre_get_posts','test_hook')
并在产品页面中调用它:do_action('pre_get_posts');
问题在于,当我调用该动作时,会调用挂钩到pre_get_posts的其他函数,并且出现以下错误:Call to a member function is_main_query() on a non-object in wc-deprecated-functions.php
我查了那段代码,看起来像是:
add_action( 'pre_get_posts', 'wc_shop_order_status_backwards_compatibility' );
function wc_shop_order_status_backwards_compatibility( $q ) {
if ( $q->is_main_query() ) {
return;
}
//...and it goes on
}
我需要在不影响这些功能的情况下勾选我的功能,但我真的不知道如何。如果我评论这个函数,另一个挂钩到pre_get_posts的函数会返回相同的错误。
PS:我的功能是空的。我看到它的方式,即使没有创建我自己的钩子,只能通过调用该页面内的钩子(archive_products.php)来创建此错误。
答案 0 :(得分:2)
你不应该在你的页面上调用do_action('pre_get_posts')
...它会在创建查询变量对象之后但在运行实际查询之前自动调用。有关快速说明,请参阅the documentation。
更多上下文:需要明确调用核心WordPress Actions的任何内容(并且不会使用do_action()
调用它们)。虽然在模板中调用wp_head();
之类的内容,但这实际上是wp_head() function,而不是action。
WordPress有时令人困惑,因为它复制了动作,钩子和函数的名称。