Search by Hyphen

时间:2016-12-06 作者:Chin Leung

我当前正在版本上运行Wordpress4.6.1 我正在尝试搜索包含该角色的帖子- (连字符)。但是,search参数将我的连字符用作否定。

WP_Query 文件:

在术语前面加连字符将排除与该术语匹配的帖子。例如,“枕头-沙发”将返回包含“枕头”但不包含“沙发”的帖子(从版本4.4开始提供)。

我的问题是:

$query = new WP_Query(array(
    \'post_type\' => array(\'product\', \'product_variation\'),
    \'s\' => \'-\',
    \'posts_per_page\' => 36
));
我试图通过以下方式摆脱连字符:

\'s\' => \'\\-\'
但是,结果保持不变(var_dump($query->request)):

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE
    1=1
    AND (((wp_posts.post_title NOT LIKE \'%%\')
    AND (wp_posts.post_excerpt NOT LIKE \'%%\')
    AND (wp_posts.post_content NOT LIKE \'%%\')))
    AND (wp_posts.post_password = \'\')
    AND wp_posts.post_type IN (\'product\', \'product_variation\')
    AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'acf-disabled\')
ORDER BY
    wp_posts.post_date DESC
LIMIT 0, 36

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

一种方法是通过wp_query_search_exclusion_prefix WP 4.7+中支持的过滤器。参见票证#38099.

下面是一个示例,我们可以从- 例如。!:

add_filter( \'wp_query_search_exclusion_prefix\', function( $prefix )
{
    return \'!\'; // adjust to your needs (default is -)
} );
我们将使用的位置!apple 而不是-apple 排除apple 从搜索结果中。然后你可以搜索-.

看起来排除前缀必须是单个字符(或为空以禁用此功能),因为check in the core:

// If there is an $exclusion_prefix, terms prefixed with it should be excluded.
$exclude = $exclusion_prefix && ( $exclusion_prefix === substr( $term, 0, 1 ) );
if ( $exclude ) {
    $like_op  = \'NOT LIKE\';
    $andor_op = \'AND\';
    $term     = substr( $term, 1 );
} else {
    $like_op  = \'LIKE\';
    $andor_op = \'OR\';
}
否则听起来像是bug, 无法仅搜索术语排除前缀。

我想知道是否最好再加一个$exclusion_prefix !== $term 检查以支持:

$exclude = $exclusion_prefix 
    && $exclusion_prefix !== $term 
    && ( $exclusion_prefix === mb_substr( $term, 0, 1 ) );
if ( $exclude ) {
    $like_op  = \'NOT LIKE\';
    $andor_op = \'AND\';
    $term     = mb_substr( $term, 1 );
} else {
    $like_op  = \'LIKE\';
    $andor_op = \'OR\';
}
我们还将使用mb_substr() 而不是substr() 为排除前缀提供更广泛的字符支持。

我想我应该为这个创建一张罚单。。。

SO网友:prosti

你可以利用以下事实NOT LIKE \'%%\' 非常独特。只有在您搜索-.

add_filter( \'posts_where\', function( $where, $q )
{        
    $where = str_replace( "NOT LIKE \'%%\'", "LIKE \'%-%\'", $where);           
    return $where;

}, 10, 2 );

$args = array(
    \'post_type\'     => \'post\',
    \'post_status\'   => \'publish\',
    \'s\' => \'-\'

);

$q = new WP_Query( $args );
var_dump($query->request);
生成的查询将是:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts 
WHERE 1=1 
AND (((wp_posts.post_title LIKE \'%-%\')
AND (wp_posts.post_excerpt LIKE \'%-%\')
AND (wp_posts.post_content LIKE \'%-%\'))) 
AND wp_posts.post_type = \'post\'
AND ((wp_posts.post_status = \'publish\')) 
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10

相关推荐

GET_POSTS查询大约需要40秒来执行

我在get\\u帖子中有一个元查询,它需要花很长时间才能完成。它工作得很好,但只是时间太长了。我有一个名为event. 在每个event 发布后,有自定义元数据:post\\U sort\\U日期(事件日期YmdHis 格式,用于排序)我需要做的是获取下一个事件,该事件相对于$year 和$month 变量。所以如果$year = 2021 和$month = 10 (2021 10月)然后应该在2021 11月或之后找到第一个事件。我下面的查询很好,但很慢。执行大约需要40秒,我不知道为什么。$next