0

这是针对自定义 Wordpress 页面的,但我认为基本的数组原则应该适用。我以前没有使用过复杂的数组,所以有点迷茫,反复试验还没有奏效。

我有一个帖子数据库,每个帖子都有'shop'和'expired'的meta_key。'expired' 是一个日期(YYYY-MM-DD),用于告诉访问者帖子的内容何时过期,这个键是我正在尝试使用的。

如果帖子的“过期”日期早于今天,则会显示“优惠已过期”

如果“过期”日期在未来,则会显示“优惠将在 X 天后过期”(此脚本未在下面显示,不是必需的)

帖子按其“过期”日期(ASC)的顺序列出。问题是,当帖子过期时,我希望该帖子显示在最后而不是停留在顶部。

我目前看到的示例:

Post 1 | Expired 3 days ago
Post 2 | Expired 1 day ago
Post 3 | Expires in 2 days
Post 4 | Expires in 6 days

以及我想看到的(注意 X 后订单):

Post 3 | Expires in 2 days
Post 4 | Expires in 6 days
Post 2 | Expired 1 day ago
Post 1 | Expired 3 days ago

这是我尝试合并两者的数组代码

$postid = get_the_ID();
$meta1 = get_post_meta($postid, 'shop', true);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$today = date('Y-m-d', time());

$args = array(
'post_type' => 'post',
'meta_query' => array(
    array(
        'key' => 'shop',
        'value' => $meta1
    )
),
'paged' => $paged,
'posts_per_page' => '5',
'meta_key' => 'expired',
'meta_value' => $today,
'meta_compare' => '>',
'orderby' => 'meta_value',
'order' => 'ASC'
 );

$args2 = array(
'post_type' => 'post',
'meta_query' => array(
    array(
        'key' => 'shop',
        'value' => $meta1
    )
),
'meta_key' => 'expired',
'meta_value' => $today,
'meta_compare' => '<',
'orderby' => 'meta_value',
'order' => 'DESC'
);

$final = $args + $args2;
$query = new WP_Query( $final );

while ( $query->have_posts() ) : $query->the_post(); ?>
HTML FOR DISPLAYING POST
endwhile;

目前它似乎没有注意到 "$args2" 并且只显示 $args

我确信我的想法是正确的,需要创建两个数组并用“+”而不是 array_merge() 加入它们,但那是我无法进一步了解的地方。

有人可以请示一下吗?谢谢!

4

2 回答 2

0

您不能只使用 args+args2 语法将 2 个数组相加。PHP 无法知道您的意思。如果您希望结果是包含这两个数组的数组,您可以这样做:

$final = 数组($args, $args2)

否则,我不确定您希望如何组合这两个数组。如果您澄清它们需要如何组合,我们可能会提供更多帮助。

于 2012-10-01T18:16:06.980 回答
0

现在,如果我正确理解了您的要求,您尝试实现的解决方案实际上是不可能的。让我解释一下为什么这无法实现。

在你的两个数组中$args$args2大多数值都是相同的,留下两个赔率,我只选择一个来说明:

//it's in args    
'meta_compare' => '>'
//it's in args2
'meta_compare' => '<'

现在,当您尝试使用array_merge($args , $args2)合并这两个时会发生什么:

'meta_compare' => '<'

这意味着它正在从后面的数组中获取“meta_compare” $args2。这是文档中定义的 array_merge 函数的行为:

If the input arrays have the same string keys, then the later value for that key will overwrite the previous one

现在,如果您使用+数组联合运算符$args+$args2

'meta_compare' => '>'

这意味着它正在从$args这里的第一个数组中获取“meta_compare”。这是+文档中定义的数组联合运算符的行为:

The keys from the first array will be preserved. If an array key exists in both arrays, then the element from the first array will be used and the matching key's element from the second array will be ignored.

为什么会发生这种情况,因为在同一级别中,键必须是唯一的。因此,在您的情况下,它们处于同一级别:

$args = array ('key' => 'value1')
$args2= array ('key' => 'value2')

因此,此处只能存在一个值,因为合并数组中的“键”只能指向一个

如果是这种情况:

$args [0] = array ('key' => 'value1' ) 
$args2 [1]= array ('key' => 'value2' ) 

然后存储的两个值key都将被保留。这将是结果数组:

array(2) {
  [0]=>
  array(1) {
    ["key"]=>
    string(6) "value1"
  }
  [1]=>
  array(1) {
    ["key"]=>
    string(6) "value2"
  }
}

虽然我不是 WP 的极客,但据我了解WP_query你不能像这样传递参数(我不确定)。因此,只有一种方法可以实现这一目标。您可以分别传递这两个参数并将结果合并,因为结果很可能(我不确定)将是一个二维数组,您可以轻松地合并它们。

希望有帮助。快乐编码:)

于 2012-10-01T21:46:11.180 回答