如何在搜索页面上重置通常的$查询以推送自定义$wpdb查询?

时间:2015-05-19 作者:Mayeenul Islam

一、 最近发布了2个问题(First, Second) 没有回答。我为他们俩找到了解决办法。但现在是时候对事情进行微调了。如果我能在这里进行微调,我可以回答这两个问题。为什么要微调?因为procedural raw PHP coding 在之前更少WordPress\' way.

<?php
function project_modify_default_search( $query ) {
    if( $query->is_search && $query->is_main_query() && ! isset( $_REQUEST[\'search\'] ) ) {
        //I\'m in my search.php - confirmed

        //Reset default $query - not to execute at all

        //Do my custom complex query and pass the query as a $wp_query object
        //so that I can use the default search.php template
        global $wpdb;
        $searchQ = sanitize_text_field( get_query_var( \'s\' ) );
        $complex_query = "SELECT SQL_CALC_FOUND_ROWS {$wpdb->posts}.ID ...";
        return $custom_search_query = $wpdb->get_results( $complex_query, ARRAY_N );

    } //endif
}
add_action( \'pre_get_posts\', \'project_modify_default_search\' );
但实际上,我在两种情况下无法使用上述代码:

我无法重置默认查询我无法返回自定义查询以便获取默认查询search.php 完美无瑕地工作,但查询工作正常,我用另一种方式进行了检查。

问题是:
How can I reset the usual $query on the search page to initiate my custom $wpdb query there?

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

这不是怎么回事pre_get_posts 作品

pre\\u get\\u posts操作允许开发人员通过引用访问$query对象(any changes you make to $query are made directly to the original object - no return value is necessary).

https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

你所做的完全是错误的。您不会通过“返回”另一个查询pre_get_posts, 您可以更改现有查询。我不知道什么是如此复杂,您无法通过一组适当的过滤器来完成,但如果您必须有一些自定义SQL,那么:

function project_modify_default_search( $query ) {
  if( $query->is_search && $query->is_main_query() && ! isset( $_REQUEST[\'search\'] ) ) {

    //I\'m in my search.php - confirmed

    //Reset default $query - not to execute at all

    //Do my custom complex query and pass the query as a $wp_query object
    //so that I can use the default search.php template
    global $wpdb;
    $searchQ = sanitize_text_field( get_query_var( \'s\' ) );

    // Sample "complex" query
    $complex_query = "SELECT SQL_CALC_FOUND_ROWS {$wpdb->posts}.ID FROM {$wpdb->posts} WHERE {$wpdb->posts}.post_title LIKE \'$searchQ%\' LIMIT 10";

    // Use `get_col` to return a simple array of IDs
    $custom_search_query = $wpdb->get_col( $complex_query );

    // Pass those IDs to the main query
    $query->set(\'post__in\',$custom_search_query);

    // can\'t kill the default search here or it can break some functions.
    // $query->set(\'s\',NULL);

    // So we do this:
    add_action( \'posts_search\', \'__return_empty_string\' );

  } //endif
}
add_action( \'pre_get_posts\', \'project_modify_default_search\' );
同样,可以肯定的是,这是生成复杂查询的错误方法,尤其是考虑到相对于通过一组过滤器修改主查询,您至少有一个额外的查询--posts_where, posts_join, 等

结束

相关推荐

似乎无法运行JQuery(WordPress插件)

我试图学习如何使用Wordpress创建插件,但我偶然发现了这个问题:每当我尝试运行JQuery时,我都会得到未定义的错误等。。。我尝试了在互联网上找到的不同方法,如取消注册/注册/排队,但似乎没有任何效果。目标是在插件设置页面中填充文本区域,而无需重新加载/保存页面以创建实时预览。这就是我现在正在做的:class plugin { public function __construct() { add_action(\"wp_enqueue_scrip