Search with filters and title

时间:2013-10-19 作者:Gabriel

我想搜索custom_post 按标题和ACF字段。

所以,我用了WP_Query WordPress函数,但我不能按标题过滤,只能按过滤器过滤。

当我提交表单时,我有这样的URL:

http://example.com/?s=titre&filter1=condition1&filter2=condition2&filter3=condition3
我的代码:

$title = $_GET[\'s\'];
$args = array(
    \'pagename\' => $title,
    \'numberposts\' => -1,
    \'post_type\' => \'my_custom_post\',
    \'meta_query\' => array(
        array(
            \'key\' => \'filter_1\',
            \'value\' => $_GET[\'condition_1\']
        ),
        array(
            \'key\' => \'filter_2\',
            \'value\' => $_GET[\'condition_2\']
        ),
        array(
            \'key\' => \'filter_3\',
            \'value\' => $_GET[\'condition_3\']
        )
    )
);
$the_query = new WP_Query($args);
你有没有办法在搜索中包含标题?

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

首先,您正在设置$_GET[\'filterN\'] 但你想用$_GET[\'condition_N\']. 这永远不会奏效。

其次pagename 是“精确匹配”值,而不是搜索参数only 使用“页面”帖子类型(至少据我所知)。您使用的是CPT,可能不需要精确匹配。如果这样做,其他查询条件将毫无意义。所以这也不能正常工作。

您可以做的最简单的事情就是使用s 参数

$title = esc_textarea( $_GET[\'s\'] );
$args = array(
    \'s\'           => $title,
    \'numberposts\' => -1,
    \'post_type\'   => \'my_custom_post\',
    \'meta_query\'  => array(
        array(
            \'key\'   => \'filter_1\',
            \'value\' => esc_attr( $_GET[\'filter1\'] )
        ),
        array(
            \'key\'   => \'filter_2\',
            \'value\' => esc_attr( $_GET[\'filter2\'] )
        ),
        array(
            \'key\'   => \'filter_3\',
            \'value\' => esc_attr( $_GET[\'filter3\'] )
        )
    )
);
$the_query = new WP_Query( $args );
将在帖子标题中搜索您的$title 一串它还将搜索post_content. 要仅搜索标题,需要过滤查询的搜索部分。

function only_title_search_wpse_119422( $search ) {
    remove_filter( \'posts_search\', \'only_title_search_wpse_119422\' );

    global $wpdb;

    $pattern = "/\\({$wpdb->posts}.post_title[^)]+\\)/";
    preg_match_all( $pattern, $search, $matches );

    if ( ! empty( $matches[0] ) ) {
        $search = sprintf(
            " AND (%s)",
            implode( " AND ", $matches[0] )
        );
    }

    return $search;
}
add_filter( \'posts_search\', \'only_title_search_wpse_119422\' );
在二次查询运行之前立即添加它。

我不能肯定,但我想知道你是否应该在pre_get_posts 而不是辅助查询。这两种情况都应采用相同的基本理念。

注意:始终使用esc_*() 以及使用前的其他消毒方法$_REQUEST/$_GET/$_POST 数据库调用中的值

结束

相关推荐

Searching With Apostrophe

我的自定义主题搜索功能有问题。我有很多帖子的标题中都有撇号。例如McDonald\'s.然而,当我尝试搜索时说McDonalds, 该帖子不会在搜索结果中返回。我怎样才能确保McDonald\'s 将返回结果,即使用户没有包含撇号。

Search with filters and title - 小码农CODE - 行之有效找到问题解决它

Search with filters and title

时间:2013-10-19 作者:Gabriel

我想搜索custom_post 按标题和ACF字段。

所以,我用了WP_Query WordPress函数,但我不能按标题过滤,只能按过滤器过滤。

当我提交表单时,我有这样的URL:

http://example.com/?s=titre&filter1=condition1&filter2=condition2&filter3=condition3
我的代码:

$title = $_GET[\'s\'];
$args = array(
    \'pagename\' => $title,
    \'numberposts\' => -1,
    \'post_type\' => \'my_custom_post\',
    \'meta_query\' => array(
        array(
            \'key\' => \'filter_1\',
            \'value\' => $_GET[\'condition_1\']
        ),
        array(
            \'key\' => \'filter_2\',
            \'value\' => $_GET[\'condition_2\']
        ),
        array(
            \'key\' => \'filter_3\',
            \'value\' => $_GET[\'condition_3\']
        )
    )
);
$the_query = new WP_Query($args);
你有没有办法在搜索中包含标题?

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

首先,您正在设置$_GET[\'filterN\'] 但你想用$_GET[\'condition_N\']. 这永远不会奏效。

其次pagename 是“精确匹配”值,而不是搜索参数only 使用“页面”帖子类型(至少据我所知)。您使用的是CPT,可能不需要精确匹配。如果这样做,其他查询条件将毫无意义。所以这也不能正常工作。

您可以做的最简单的事情就是使用s 参数

$title = esc_textarea( $_GET[\'s\'] );
$args = array(
    \'s\'           => $title,
    \'numberposts\' => -1,
    \'post_type\'   => \'my_custom_post\',
    \'meta_query\'  => array(
        array(
            \'key\'   => \'filter_1\',
            \'value\' => esc_attr( $_GET[\'filter1\'] )
        ),
        array(
            \'key\'   => \'filter_2\',
            \'value\' => esc_attr( $_GET[\'filter2\'] )
        ),
        array(
            \'key\'   => \'filter_3\',
            \'value\' => esc_attr( $_GET[\'filter3\'] )
        )
    )
);
$the_query = new WP_Query( $args );
将在帖子标题中搜索您的$title 一串它还将搜索post_content. 要仅搜索标题,需要过滤查询的搜索部分。

function only_title_search_wpse_119422( $search ) {
    remove_filter( \'posts_search\', \'only_title_search_wpse_119422\' );

    global $wpdb;

    $pattern = "/\\({$wpdb->posts}.post_title[^)]+\\)/";
    preg_match_all( $pattern, $search, $matches );

    if ( ! empty( $matches[0] ) ) {
        $search = sprintf(
            " AND (%s)",
            implode( " AND ", $matches[0] )
        );
    }

    return $search;
}
add_filter( \'posts_search\', \'only_title_search_wpse_119422\' );
在二次查询运行之前立即添加它。

我不能肯定,但我想知道你是否应该在pre_get_posts 而不是辅助查询。这两种情况都应采用相同的基本理念。

注意:始终使用esc_*() 以及使用前的其他消毒方法$_REQUEST/$_GET/$_POST 数据库调用中的值

相关推荐

为内置钩子调用do_action和Apply_Filters是否安全?

我正在开发一个插件,它需要复制一些内置的WordPress逻辑。(此逻辑不能用任何内置方法调用,也不能独立连接到。)在这个动作序列中,WordPress的正常行为是调用动作挂钩(do_action(\'wp_login\', ...)) 和过滤器挂钩(apply_filters(\'login_redirect\', ...)).如果在对应于在Core中调用它们的时间点调用它们,那么直接从我的插件调用这些内置钩子是否安全(并且是可以接受的做法)?或者,其他与此相关的开发人员期望在非常特定的时间执行操作的风