自定义WordPress搜索以包括包含搜索结果的帖子

xlpyo6sf  于 12个月前  发布在  WordPress
关注(0)|答案(1)|浏览(161)

我有下面的代码,我试图编辑没有运气。
我希望能够包括可能有搜索词 s 作为后标签的职位。

add_action('pre_get_posts','modify_search');
function modify_search($query)
{
if ($query->is_search() && $query->is_main_search() && !is_admin()) {

    if (isset($_GET['post_type'])) {

        $query->set('s', sanitize_text_field($_GET['s']));

        $query->set('post_type', sanitize_text_field($_GET['post_type']));

    }

}

字符串
}
我尝试了多种不同的方法来设置查询的“tax_query”参数,但都没有成功。
其目标是能够列出所有的职位和cpts可能有搜索词在其标题,内容或摘录,但也有任何职位,包含搜索词作为一个职位的标签
任何帮助都将不胜感激
编辑:

function custom_search_filter($query) {
if ($query->is_search && !is_admin()) {
    $tax_query = array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'post_tag',
            'field'    => 'name',
            'terms'    => $query->query_vars['s'],
        ),
    );

    // Debugging output
    error_log(print_r($tax_query, true));

    $query->set('tax_query', $tax_query);
}
}
add_action('pre_get_posts', 'custom_search_filter');


更新,以提供一个许多不同的方式,我已经尝试去这一点。
我不想改变搜索的默认方法,看标题,内容或摘录,我只是想钩到搜索,也显示任何可能包含搜索词提供的职位。
我会加上我也有一个表格与复选框,我过滤的结果的基础上,cpt的,但这是无关的,这项任务

bwleehnv

bwleehnv1#

使用SQL语言,这个问题是要求两个查询的UNION。WordPress本身并不处理这个问题。一个实验性的WordPress插件可以完成这个任务:合并查询。
下面的解决方案中的代码已经过测试。它使用原生WordPress钩子和函数。
解决方案包括以下步骤:
1.使用posts_results过滤器钩子来更新默认的搜索结果列表,
1.使用WP_Query为经过标签过滤的帖子列表生成二级查询,
1.将两个列表合并组合,
1.删除重复项,以及
1.排序最终结果。

posts_results

posts_results过滤器钩子用于更新从默认搜索结果生成的帖子列表。WordPress文档说:* 在状态检查之前过滤原始帖子结果数组。*

警告!

WordPress文档说:
这个过滤器的输入是一个帖子数组,由任何(?)WP_Query创建,用于查找帖子。
你应该准备在WordPress中使用WP_Query anywhere(核心,主题,子主题,第三方插件,块,小部件等)受此过滤器的影响。假设您限制其使用条件标签,如is_searchis_adminposts_results过滤器挂钩应仅应用于搜索(结果)页面。因此,所有块,小部件,直接或间接使用WP_Query的搜索页面上的其他页面可能会受到此过滤器的影响。

无限循环

由于WP_Query用于二次查询,并且 * 任何 * 使用WP_Query都会触发posts_results过滤器钩子,因此存在无限循环的风险。为了避免此问题,应在调用new WP_Query之前删除posts_results回调,在使用WP_Query后重新添加。在if语句中使用条件标记可以删除回调并重新添加。在下面的my_posts_search_results_filter函数中不需要添加。但是,应该注意防止这些无限循环。

WP_Query

WordPress文档是这样描述WP_Query post_type参数的:
[The]默认值为'post'。如果查询设置了'tax_query',则默认值为'any';
然而,测试表明,在二级查询中使用tax_query不会在省略post_type时从自定义帖子类型生成帖子。因此,post_type必须包含在二级查询参数中,并且必须显式列出任何所需的自定义帖子类型。

排序

与SQL UNION一样,排序是在列表合并后完成的。usort用于按post_date的降序对合并后的列表进行排序(即最新的帖子优先)。

解决方案

/**
 * Sort WP_Post objects in reverse order (most recent first).
 *
 * @param string $key WP_Post object property used for sorting. 'post_date' is assumed.
 *
 * @return int
 */
function post_sort( $key ) {
    return function ( $a, $b ) use ( $key ) {
        if ( $a->$key < $b->$key ) {
            return 1;
        } elseif ( $a->$key > $b->$key ) {
            return -1;
        } else {
            // If first comparison is equal, use title as secondary sort key.
            return strnatcasecmp( $a->post_title, $b->post_title );
        }
    };
}

/**
 * Remove duplicate posts in combined list from default and secondary queries.
 *
 * @param array  $posts Array of WP_Post objects.
 * @param string $key   Search key used to identify duplicate objects. Post ID is used
 *
 * @return array
 */
function dedupe( $posts, $key ) {
    $unique_posts = array();
    $ids = array();

    foreach ( $posts as $post ) {
        if ( ! in_array( $post->$key, $ids ) ) {
            $ids[] = $post->$key;
            $unique_posts[] = $post;
        }
    }

    return $unique_posts;
}

/**
 * posts_results filter hook callback.
 *
 * @param array  $posts Array of WP_Post objects.
 * @param object $query WP_Query object from default search.
 *
 * @return array
 */
function my_posts_search_results_filter( $posts, $query ) {
    if ( \is_search() && $query->is_search() && ! \is_admin() ) {
        $args = array(
            'post_type' => array( 'post', 'page' ),
            'tax_query' => array(
                array(
                    'taxonomy' => 'post_tag',
                    'field' => 'name',
                    'terms' => $query->get( 's' )
                )
            )
        );

        // Remove callback to avoid infinite loop.
        \remove_filter( 'posts_results', 'my_posts_search_results_filter', 10 );
        $secondary_query = new \WP_Query( $args );
        $tagged_posts = $secondary_query->get_posts();

        // Combine default search results with secondary query.
        $all_posts = array_merge( $posts, $tagged_posts );

        // Remove duplicate posts.
        $unique_posts = dedupe( $all_posts, 'ID' );

        // Sort by reverse post_date order (most recent first).
        usort( $unique_posts, post_sort( 'post_date' ) );

        // Restore posts_results callback.
        \add_filter( 'posts_results', 'my_posts_search_results_filter', 10, 2 );

        return $unique_posts;
    } else {
        return $posts;
    }   
}

\add_filter( 'posts_results', 'my_posts_search_results_filter', 10, 2 );

字符串

相关问题