问题描述

我想显示给定价格范围内的所有帖子。例如:当用户输入 100 和 1000(两个单独的表单字段) 时 – 我的站点将显示所有具有名为 price 的自定义字段的帖子,其数值在 100 到 1000 之间。

在 WP Query 的文档中找到这个; 但是,我不确定我如何根据 WordPress 网站上的表单的输入创建查询。

$args = array(
'post_type' => 'product',
'meta_query' => array(
    array(
        'key' => 'color',
        'value' => 'blue',
        'compare' => 'NOT LIKE'
    ),
    array(
        'key' => 'price',
        'value' => array( 20, 100 ),
        'type' => 'numeric',
        'compare' => 'BETWEEN'
    )
)
);
$query = new WP_Query( $args );

感谢您的时间。

最佳解决思路

使用 pre_get_posts 操作来检测 URL 中的一些过滤器变量,并相应地过滤查询。

例如,说你的表单设置 price_lowprice_high GET vars,所以 URL 看起来像:

domain.com/?price_low=100&price_high=1000

然后,您的过滤器功能将检查是否存在这些变量,并创建 meta_query 。此示例检查是否是主页上的主要查询,请参阅 Conditional Tags 页面,了解如何检查其他类型的查询是否发生,如类别或标签等。

function wpa_filter_home_query( $query ){
    if( $query->is_home()
    && $query->is_main_query()
    && isset( $_GET['price_low'] )
    && isset( $_GET['price_high'] ) ) {
        $meta_query = array(
            array(
                'key' => 'price',
                'value' => array( $_GET['price_low'], $_GET['price_high'] ),
                'type' => 'numeric',
                'compare' => 'BETWEEN'
            )
        );
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'wpa_filter_home_query' );

编辑 – 提交值的简单形式的例子。省略 action 属性将表单提交到当前页面。

<form method="GET">
    <input type="text" name="price_low">
    <input type="text" name="price_high">
    <input type="submit">
</form>

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。