0

これはカスタムWordpressページ用ですが、基本的な配列の原則を適用する必要があると思います。私はこれまで複雑なアレイを扱ったことがないので、少し迷っています。試行錯誤はまだうまくいきません。

投稿のデータベースがあり、各投稿には「shop」と「expired」のmeta_keyがあります。「期限切れ」は、投稿のコンテンツがいつ期限切れになるかを訪問者に通知するために使用される日付(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

そして私が見たいもの(Post 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

これは、2つをマージしようとした私の配列コードです

$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のみが表示されます。

私の考えは正しい方向にあると確信しています。2つの配列を作成し、array_merge()ではなく「+」でそれらを結合する必要がありますが、それ以上は得られません。

誰かが親切に光を当ててもらえますか?ありがとう!

4

2 に答える 2

0

args+args2 構文を使用して 2 つの配列を一緒に追加することはできません。PHPは、それが何を意味するのかを知る方法がありません。結果をこれらの配列の両方を含む配列にしたい場合は、次のようにすることができます。

$final = 配列($args, $args2)

そうしないと、これら 2 つの配列をどのように組み合わせるかわかりません。それらをどのように組み合わせる必要があるかを明確にすると、さらに役立つ可能性があります。

于 2012-10-01T18:16:06.980 に答える
0

私があなたの要件を正しく理解していれば、あなたが達成しようとしている解決策は実際には不可能です. これが達成できない理由を説明しましょう。

あなたの2つの配列$argsでは、$args2ほとんどの値が同じで、2つのオッズが残っています。説明するために1つだけを選んでいます:

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

array_merge($args , $args2)を使用してこの 2 つをマージしようとするとどうなりますか:

'meta_compare' => '<'

つまり、$args2ここにある後の配列から「meta_compare」を取得しています。これは、ドキュメントで定義されている 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」を取得しています。これは+、doc で定義されている配列共用体演算子の動作です。

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')

したがって、マージされた配列 'key' は1 つだけを指すことができるため、ここには 1 つの値しか存在できません。

これがシナリオの場合:

$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から理解している限り、このような引数を渡すことはできません(よくわかりません)。したがって、これを達成する方法は 1 つしかありません。これらの 2 つの引数を別々に渡し、その結果をマージすることができます。結果はおそらく (よくわかりません) 簡単にマージできる 2D 配列になります。

それが役立つことを願っています。ハッピーコーディング:)

于 2012-10-01T21:46:11.180 に答える