从搜索中排除不在分类术语中的所有自定义帖子

时间:2012-10-16 作者:Cthulhu

我有一篇自定义帖子,其中有一个相关的分类法。这种分类法只有一个术语,帖子以布尔方式要么属于它,要么不属于它。

在搜索结果中,我希望显示属于分类法的自定义帖子,而不显示不属于分类法的帖子。我想了两种方法来实现这一点,但我不确定哪种方法是最好的:

仅包括属于分类术语的自定义帖子我已经成功地实现了与我想要的完全相反的操作,代码如下:

global $query_string;
$query_args = explode("&", $query_string);
$search_query = array();
foreach($query_args as $key => $string) {
    $query_split = explode("=", $string);
    $search_query[$query_split[0]] = urldecode($query_split[1]);
}

$custom_query = array();
$custom_query[\'tax_query\'][] = array( \'taxonomy\' => \'tax-whatever\', \'terms\' => array(\'term-whatever\'), \'field\' => \'slug\', \'operator\' => \'NOT IN\' );
$args = array_merge( $wp_query->query, $custom_query );
query_posts( $args );

$search = new WP_Query($search_query);
当然,这会输出所有不在术语中的自定义帖子。我如何才能实现完全相反的目标?

EDIT

我会尽量把我的问题解释清楚一点。让我们举个例子。

假设我有一个称为“选定”的分类法only one 分类术语“是”,用户可以通过复选框进行选择。我想我应该使用两个复选框(“是”和“否”),但当时我认为这没有多大意义。

当用户在网站中搜索某个内容时,所有页面、帖子和自定义帖子都会显示在结果中。我只想从搜索结果中删除自定义帖子that are not associated 用分类学术语“是”,其余的都保持原样。这意味着我要输出所有页面、帖子和“是”自定义帖子。

有什么办法可以做到这一点吗?谢谢

UPDATE

我有一个想法:有没有办法进行两次查询并合并结果?

一个查询,包含除自定义帖子外的所有帖子和页面(\'exclude_from_search\' => true);$custom_query[\'tax_query\'][] = array( \'taxonomy\' => \'tax-whatever\', \'terms\' => array(\'term-whatever\'), \'field\' => \'slug\', \'operator\' => \'IN\' );).

$mergedposts = array_merge( $wp_query->query, $custom_query );
query_posts( $mergedposts );
它只会显示自定义帖子。

我想我可以使用SQL进行直接查询,但我从未使用过它。虽然这是我希望在将来学习的东西,但现在这似乎不是解决这类问题的好方法,因为我不明白我在做什么。

目前为止,我最好的选择是创建一个新的分类术语,并用它对所有“未分类”的自定义帖子进行分类。然而,它们只有几百个,所以需要一段时间。

NEW UPDATE

我找到了一种方法来检测自定义帖子是否属于分类法中的特定术语。这是我在某处学到的一段代码,因为我不具备PHP知识,无法独自创建这样的东西。然而,我了解正在做的事情,并根据自己的情况进行了调整。

function is_selected( $selected, $_post = null ) {
    if ( empty( $selected ) )
        return false;

    if ( $_post )
        $_post = get_post( $_post );
    else
        $_post =& $GLOBALS[\'post\'];

    if ( !$_post )
        return false;

    $r = is_object_in_term( $_post->ID, \'selected\', $selected );

    if ( is_wp_error( $r ) )
        return false;

    return $r;
}
此功能将正常工作,但只有在循环内使用时才能正常工作。但是,如果在进行搜索查询后更改循环,可能会弄乱分页,找到的结果数可能会错误。

不确定这是否是朝着正确方向迈出的一步,但至少这是一步。

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

阅读修改后的问题后,更容易理解你想做什么。我的新解决方案看起来就像您首先想要做的事情:它只是排除了所有属于您自定义类型的帖子,但没有与之关联的“是”术语:

$custom_query = array();
$custom_query[\'post_type\'] = \'any\';

// first, query all the posts of your custom type
// that don\'t have the "yes"-term:
$tmp_wp_query = new WP_Query(array(
    \'posts_per_page\' => -1,
    \'fields\' => \'ids\',
    \'post_type\' => \'your-post-type\',
    \'tax_query\' => array(array(
        \'taxonomy\' => \'tax-whatever\', \'terms\' => array(\'term-whatever\'),
        \'field\' => \'slug\', \'operator\' => \'NOT IN\'
    ))
));

if(!empty($tmp_wp_query->posts)) {
    // Exclude the "yes"-less posts from the actual post query
    $custom_query[\'post__not_in\'] = $tmp_wp_query->posts;
}

// now proceed with your original code and execute the definitive query
$args = array_merge( $wp_query->query, $custom_query );
query_posts( $args );

$search = new WP_Query($search_query);
唯一的缺点是,现在需要运行两个查询。但是第一个查询相对较轻,因此性能损失应该不会太大。

结束

相关推荐

Custom Taxonomy Tag Search

我有一个现有的WordPress搜索功能,我想做的是将搜索扩展到自定义分类法中的标记。。。我该怎么做?<form method=\"get\" id=\"searchform\" action=\"<?php echo home_url(); ?>\"> <input type=\"text\" value=\"Product Search...\" name=\"s\" id=\"s\" /> <input type=\"imag

从搜索中排除不在分类术语中的所有自定义帖子 - 小码农CODE - 行之有效找到问题解决它

从搜索中排除不在分类术语中的所有自定义帖子

时间:2012-10-16 作者:Cthulhu

我有一篇自定义帖子,其中有一个相关的分类法。这种分类法只有一个术语,帖子以布尔方式要么属于它,要么不属于它。

在搜索结果中,我希望显示属于分类法的自定义帖子,而不显示不属于分类法的帖子。我想了两种方法来实现这一点,但我不确定哪种方法是最好的:

仅包括属于分类术语的自定义帖子我已经成功地实现了与我想要的完全相反的操作,代码如下:

global $query_string;
$query_args = explode("&", $query_string);
$search_query = array();
foreach($query_args as $key => $string) {
    $query_split = explode("=", $string);
    $search_query[$query_split[0]] = urldecode($query_split[1]);
}

$custom_query = array();
$custom_query[\'tax_query\'][] = array( \'taxonomy\' => \'tax-whatever\', \'terms\' => array(\'term-whatever\'), \'field\' => \'slug\', \'operator\' => \'NOT IN\' );
$args = array_merge( $wp_query->query, $custom_query );
query_posts( $args );

$search = new WP_Query($search_query);
当然,这会输出所有不在术语中的自定义帖子。我如何才能实现完全相反的目标?

EDIT

我会尽量把我的问题解释清楚一点。让我们举个例子。

假设我有一个称为“选定”的分类法only one 分类术语“是”,用户可以通过复选框进行选择。我想我应该使用两个复选框(“是”和“否”),但当时我认为这没有多大意义。

当用户在网站中搜索某个内容时,所有页面、帖子和自定义帖子都会显示在结果中。我只想从搜索结果中删除自定义帖子that are not associated 用分类学术语“是”,其余的都保持原样。这意味着我要输出所有页面、帖子和“是”自定义帖子。

有什么办法可以做到这一点吗?谢谢

UPDATE

我有一个想法:有没有办法进行两次查询并合并结果?

一个查询,包含除自定义帖子外的所有帖子和页面(\'exclude_from_search\' => true);$custom_query[\'tax_query\'][] = array( \'taxonomy\' => \'tax-whatever\', \'terms\' => array(\'term-whatever\'), \'field\' => \'slug\', \'operator\' => \'IN\' );).

$mergedposts = array_merge( $wp_query->query, $custom_query );
query_posts( $mergedposts );
它只会显示自定义帖子。

我想我可以使用SQL进行直接查询,但我从未使用过它。虽然这是我希望在将来学习的东西,但现在这似乎不是解决这类问题的好方法,因为我不明白我在做什么。

目前为止,我最好的选择是创建一个新的分类术语,并用它对所有“未分类”的自定义帖子进行分类。然而,它们只有几百个,所以需要一段时间。

NEW UPDATE

我找到了一种方法来检测自定义帖子是否属于分类法中的特定术语。这是我在某处学到的一段代码,因为我不具备PHP知识,无法独自创建这样的东西。然而,我了解正在做的事情,并根据自己的情况进行了调整。

function is_selected( $selected, $_post = null ) {
    if ( empty( $selected ) )
        return false;

    if ( $_post )
        $_post = get_post( $_post );
    else
        $_post =& $GLOBALS[\'post\'];

    if ( !$_post )
        return false;

    $r = is_object_in_term( $_post->ID, \'selected\', $selected );

    if ( is_wp_error( $r ) )
        return false;

    return $r;
}
此功能将正常工作,但只有在循环内使用时才能正常工作。但是,如果在进行搜索查询后更改循环,可能会弄乱分页,找到的结果数可能会错误。

不确定这是否是朝着正确方向迈出的一步,但至少这是一步。

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

阅读修改后的问题后,更容易理解你想做什么。我的新解决方案看起来就像您首先想要做的事情:它只是排除了所有属于您自定义类型的帖子,但没有与之关联的“是”术语:

$custom_query = array();
$custom_query[\'post_type\'] = \'any\';

// first, query all the posts of your custom type
// that don\'t have the "yes"-term:
$tmp_wp_query = new WP_Query(array(
    \'posts_per_page\' => -1,
    \'fields\' => \'ids\',
    \'post_type\' => \'your-post-type\',
    \'tax_query\' => array(array(
        \'taxonomy\' => \'tax-whatever\', \'terms\' => array(\'term-whatever\'),
        \'field\' => \'slug\', \'operator\' => \'NOT IN\'
    ))
));

if(!empty($tmp_wp_query->posts)) {
    // Exclude the "yes"-less posts from the actual post query
    $custom_query[\'post__not_in\'] = $tmp_wp_query->posts;
}

// now proceed with your original code and execute the definitive query
$args = array_merge( $wp_query->query, $custom_query );
query_posts( $args );

$search = new WP_Query($search_query);
唯一的缺点是,现在需要运行两个查询。但是第一个查询相对较轻,因此性能损失应该不会太大。

相关推荐

Media searching ignored

我们的网站使用WordPress,有很多媒体文件。我们网站的媒体名称格式如下[Car brand\'s name]-[number].jpg, 例如Tesla-1.jpg 或Aston Martin-3.jpg. 因此,我们可以通过搜索文章的名称轻松找到文章的特定媒体。但突然间,我们找不到媒体。我们正在尝试搜索名称为的媒体,但搜索结果不变。(不搜索任何内容时的媒体屏幕)(搜索Aston Martin时的媒体屏幕)当然,在填充搜索文本框后,它会显示一个加载图标,但结果总是一样的。为什么会发生这种情况?更新+