在促销和准确价格之间搜索过滤器

时间:2021-05-10 作者:the_lorem_ipsum_guy

我有很多贴子都有促销价格,其余的都有确切的价格。我只是想确保如果存在促销价格,当我尝试提交输入范围中的值时,使用促销价格作为目标数据,否则使用实际价格。

在我的表格中,我有一个滑块:

<input class="price-select" name="price" value="5000" type="range" min="0" max="5000">
我的查询是这样的,但不起作用。

$args = [
   \'posts_per_page\' => -1,
   \'post_status\' => \'publish\',
   \'meta_query\' => []
];

if (isset($date)) {...}

if (isset($destination)) {...}

if (isset($price)) {
        array_push($args[\'meta_query\'], [
            \'key\'     => \'promotion_price\',
            \'value\'   => $price,
            \'type\'    => \'numeric\',
            \'compare\' => \'<=\',
        ]);
        array_push($args[\'meta_query\'], [
            \'key\'     => \'exact_price\',
            \'value\'   => $price,
            \'type\'    => \'numeric\',
            \'compare\' => \'<=\',
        ]);
    }

    $getPackages = new WP_Query( $args );
这一个很好,但它不符合我的要求,因为我想不出任何解决方案。

我试过使用BETWEENIN 但它不起作用。我不确定在这种情况下它是如何工作的。

Adding more information:

我有很多搜索过滤器,我添加它们的方式是使用array_push. 我尝试执行下面的代码,但它会影响其他搜索筛选器,并返回空。尝试执行\'relation\' => \'OR\', 它适用于其他搜索过滤器,但价格和促销价格不起作用。

$args = [
   \'posts_per_page\' => -1,
   \'post_status\' => \'publish\',
   \'meta_query\' => [
       \'relation\' => \'AND\'
   ]
];
任何想法都将不胜感激!谢谢

阵列转储自$args

上没有关系meta_query

array(6) {
  ["post_type"]=>
  string(15) "post"
  ["posts_per_page"]=>
  int(4)
  ["post_status"]=>
  string(7) "publish"
  ["tax_query"]=>
  array(0) {
  }
  ["meta_query"]=>
  array(2) {
    [0]=>
    array(4) {
      ["key"]=>
      string(34) "promotion_price"
      ["value"]=>
      string(3) "439"
      ["type"]=>
      string(7) "numeric"
      ["compare"]=>
      string(2) "<="
    }
    [1]=>
    array(4) {
      ["key"]=>
      string(24) "exact_price"
      ["value"]=>
      string(3) "439"
      ["type"]=>
      string(7) "numeric"
      ["compare"]=>
      string(2) "<="
    }
  }
  ["paged"]=>
  int(1)
}
关系打开时meta_query

array(6) {
  ["post_type"]=>
  string(15) "post"
  ["posts_per_page"]=>
  int(4)
  ["post_status"]=>
  string(7) "publish"
  ["tax_query"]=>
  array(0) {
  }
  ["meta_query"]=>
  array(3) {
    ["relation"]=>
    string(2) "OR"
    [0]=>
    array(4) {
      ["key"]=>
      string(34) "promotion_price"
      ["value"]=>
      string(3) "456"
      ["type"]=>
      string(7) "numeric"
      ["compare"]=>
      string(2) "<="
    }
    [1]=>
    array(4) {
      ["key"]=>
      string(24) "exact_price"
      ["value"]=>
      string(3) "456"
      ["type"]=>
      string(7) "numeric"
      ["compare"]=>
      string(2) "<="
    }
  }
  ["paged"]=>
  int(1)
}
我的所有数组参数和搜索筛选器:

$args = [
        \'post_type\'  => \'post\',
        \'posts_per_page\' => 4,
        \'post_status\' => \'publish\',
        \'tax_query\' => [],
        \'meta_query\' => [],
        \'paged\' => 1
];
if (isset($dates)) {
        array_push($args[\'meta_query\'], [
            \'key\'     => \'dates\',
            \'compare\' => \'IN\',
            \'value\'   => $dates,
        ]);
    }


    if (isset($price)) {
        array_push($args[\'meta_query\'], [
            \'key\'     => \'promotion_price\',
            \'value\'   => $price,
            \'type\'    => \'numeric\',
            \'compare\' => \'<=\',
        ]);
        array_push($args[\'meta_query\'], [
            \'key\'     => \'exact_price\',
            \'value\'   => $price,
            \'type\'    => \'numeric\',
            \'compare\' => \'<=\',
        ]);
    }

    if (isset($packages)) {
        foreach ($packages as $package) {
            array_push($args[\'tax_query\'], [
                \'taxonomy\' => \'tax_1\',
                \'field\'    => \'term_id\',
                \'terms\'    => $package,
            ]);
        }
    }

    if (isset($durations)) {
        foreach ($durations as $duration) {
            array_push($args[\'tax_query\'], [
                \'taxonomy\' => \'tax_2\',
                \'field\'    => \'term_id\',
                \'terms\'    => $duration,
            ]);
        }
    }

    if (isset($departures)) {
        foreach ($departures as $departure) {
            array_push($args[\'tax_query\'], [
                \'taxonomy\' => \'tax_3\',
                \'field\'    => \'term_id\',
                \'terms\'    => $departure,
            ]);
        }
    }

$getPackages = new WP_Query( $args );

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

为了使用两个或多个需要有关系的不同元字段,必须为relation 钥匙通过这种方式,您可以建立元字段必须满足的关系。

在您的特定情况下,您可以使用关系AND 确保$price 大于或等于促销价格,但也低于或等于确切价格。

所以根据你的问题;搜索筛选器between 促销和确切价格”;你的meta_query 数组将类似于:

\'meta_query\' => array(
    \'relation\' => \'AND\',
    array(
        \'key\'     => \'promotion_price\',
        \'value\'   => $price,
        \'compare\' => \'>=\',
        \'type\'    => \'NUMERIC\'
    ),
    array(
        \'key\'     => \'exact_price\',
        \'value\'   => $price,
        \'compare\' => \'<=\',
        \'type\'    => \'NUMERIC\'
    )
),
摘录自WP Meta Query 文档:

您可以选择通过relation 键并将其设置为或和。当存在多个元查询时,它定义了关系(是应该满足所有条件,还是至少需要满足其中一个条件)

使用多个嵌套的元查询,还可以嵌套具有多个关系键的多个元查询。因此,可以创建不同的条件块。例如,到ignore 这个promotion_price 键(如果不存在),但如果存在,则使用它:

\'meta_query\'  => array(
    \'relation\' => \'OR\',
    array(
        \'relation\' => \'AND\',
        array(
            \'key\'     => \'promotion_price\',
            \'compare\' => \'NOT EXISTS\'
        ),
        array(
            \'key\'     => \'exact_price\',
            \'value\'   => $price,
            \'compare\' => \'<=\',
            \'type\'    => \'NUMERIC\',
        ),
    ),
    array(
        \'relation\' => \'AND\',
        array(
            \'key\'     => \'promotion_price\',
            \'value\'   => $price,
            \'compare\' => \'>=\',
            \'type\'    => \'NUMERIC\'
        ),
        array(
            \'key\'     => \'exact_price\',
            \'value\'   => $price,
            \'compare\' => \'<=\',
            \'type\'    => \'NUMERIC\'
        ),
    )
),
如果有更多的条件句,可以继续按照相同的结构嵌套它们。在每个级别上,您都会有一个\'relation\' => \'OR/AND\' 具有两个或多个阵列。

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post