【问题标题】:hotel price comparison logic using wordpress posts使用 wordpress 帖子的酒店价格比较逻辑
【发布时间】:2012-11-17 22:05:10
【问题描述】:

考虑一种情况,我发布了元字段:

  1. 最低价格
  2. 最高价格

所以每个帖子都有这两个字段,并且值可以是从非零到1000的任何整数。

举个例子:

  1. 发布 #1 min_price = 5; max_price = 100
  2. 发布 #2 min_price = 50; max_price = 150

我想制作自定义订单逻辑以与 query_posts 一起使用。因此用户可以选择价格范围并查看具有选定值的帖子。

现在,如果我只有 1 个价格和 1 个字段,那么让用户选择价格范围并获取属于这些范围的帖子会很容易,如下所示:

query_posts( array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'price',
            'value' => array( 100, 200 ),
            'compare' => 'BETWEEN',
            'type' => 'numeric',
        )
    )
) );

所以这里每一个价格在 100-200 之间的帖子都会可见。

但是我有一个范围的值...我认为这会起作用:

query_posts( array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'min_price',
            'value' => array( 100, 200 ),
            'compare' => 'BETWEEN',
            'type' => 'numeric',
        ),
            array(
            'key' => 'max_price',
            'value' => array( 100, 200 ),
            'compare' => 'BETWEEN',
            'type' => 'numeric',
        )
    )
) );

这里客户端选择范围100200 帖子 #1 和帖子 #2 的值都在此范围内,因此访问者会对它们都感兴趣。不幸的是,我的查询逻辑将它们排除在外。

我的大脑现在工作不正常,所以我错过了一些简单的事情。有什么提示吗?

【问题讨论】:

    标签: wordpress comparison logic


    【解决方案1】:

    我现在知道你的方法应该可行,除了 McNab 可能是对的(这里有很多例子:http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters),但我会保留我的旧答案。有人可能会发现它对非标准的东西很有用。

    我不知道你是否可以使用查询后参数来做到这一点,但我在源代码中查找了它,查询是这样的:

    SELECT $found_rows $distinct $fields 
    FROM $wpdb->posts $join 
    WHERE 1=1 $where 
    $groupby 
    $orderby 
    $limits
    

    这些是对应于相关查询变量的过滤器:

    $where = apply_filters_ref_array('posts_where', array( $where, &$this ) );
    $join = apply_filters_ref_array('posts_join', array( $join, &$this ) );
    

    也就是说问题可以归结为SQL:

    function postmeta_join( $join )
    {
        $join .= "
        LEFT JOIN $wpdb->postmeta AS max_price ON max_price.meta_key = 'max_price'
        LEFT JOIN $wpdb->postmeta AS min_price ON min_price.meta_key = 'min_price'";
        return $join;
    }
    
    function filter_prices($where)
    {
        $where .= " AND max_price.max_price BETWEEN 100, 200 AND min_price.min_price BETWEN 100, 200";
        return $where;
    }
    
    add_filter( 'posts_where', 'filter_prices' );
    add_filter( 'posts_join', 'postmeta_join' );
    

    现在我不是 SQL 专家,所以这可能存在问题。但如果你没有得到任何其他答案,你可以玩这个。 (顺便说一句,您可能想在完成过滤器后删除它们。)

    【讨论】:

    • 拥有这个信息真的很有用 IMO,我最近有一段时间调试一个大的 meta_query 问题,我认为将它与它生成的 SQL 关联起来非常有用。我有几个想法,也会更新我的答案。
    【解决方案2】:

    您所做的应该可以工作,但您错过了“关系”参数。应该是;

                    'meta_query' => array(
                        'relation' => 'AND',
                        array(
                            'key' => 'min_price',
                            'value' => array( 100, 200 ),
                            'compare' => 'BETWEEN',
                            'type' => 'numeric',
                        ),
                            array(
                            'key' => 'max_price',
                            'value' => array( 100, 200 ),
                            'compare' => 'BETWEEN',
                            'type' => 'numeric',
                        )
                    )
    

    要注意的另一件事是,在第一个实例中,meta_id 是“price”,而在第二个实例中,您使用的是“min_price”和“max_price”。这些确定是设置好的吗?

    我之所以提到这一点,是因为最近我在处理这些带有多个子数组的元查询以及用户以表单形式提交值的 AND 关系时遇到了困难(就像我对您的问题的理解一样)。存在一个问题,即在数组中的项目存在空值的情况下,查询不起作用。这意味着要由 scribu 修复;

    http://core.trac.wordpress.org/ticket/18158

    但我根本无法让它工作。扯掉我的头发。我最终检查了提交的值以查看是否有一个,然后单独创建数组。如果 $min_array 或 $max_array 为 NULL,则查询将起作用,但如果 meta_values 中的任何一个为 NULL 并且它是按照您的方式构建的,则查询将不起作用。我希望这是有道理的,我的代码如下;

                    if ($min_price) {
                      $min_array = array('key' => 'min_price','value' => $min_price, 'value' => '=', 'type' => 'numeric');
                    }
    
                    if ($max_price) {
                      $max_array = array('key' => 'max_price','value' => $max_price, 'value' => '=', 'type' => 'numeric');
                    }
    
                    'meta_query' => array(
                        'relation' => 'AND',
                        $min_array,
                        $max_array
                    ) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多