(カスタム)投稿を2つのカスタムフィールド値でソートする必要があります...
カスタムフィールド名1:is_sponsored
[値はいずれかになります1
か0
]
カスタムフィールド名2:sfp_date
[ timestamp
別名、現在の投稿日(秒)]
「is_sponsored
」の値が1の投稿は、「sfp_date
」でDESC
終了順に並べ替えて、一番上にする必要があります。「is_sponsored
」の値が0 である他のすべての投稿は、下に「-」の降順でリストさsfp_date
れます。
私のようなものがあります:
$sfp_query_args = array(
'tax_query' => array(
array(
'taxonomy' => 'sfp_posts',
'terms' => array( 1, 5, 8 )
)
),
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => 15,
'paged' => $paged,
'meta_key' => 'sfp_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_query' => array(
'key' => 'is_sponsored',
'value' => 2,
'type' => 'NUMERIC',
'compare' => '<='
)
);
$wp_q = new WP_Query( $sfp_query_args );
...しかし動作しません。何か案は?
編集者注:これは、これをテストするために使用できるデータセットがない可能性があるため、クエリがどのように表示されるかを示す小さなプラグインです。
<?php
/** Plugin Name: (#67600) Dump Query parts */
function wpse67600_dump_query_parts( $pieces )
{
echo '<pre>'.var_export( $pieces, true ).'</pre>';
return $pieces;
}
add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );
OPプラグインの出力をここに追加してください-「編集」リンクを使用してください。
Dameerによる編集
さて、リクエストを追跡し、多くの回避策を実行した後、私は次のことを思いつきました...
「$ sfp_query_args」を少し簡略化すると、結果は必要なものに近くなりますが、投稿を並べ替えることはできません。ここにあります:
$sfp_query_args1 = array(
'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => (int)$per_page,
'paged' => $paged,
'meta_key' => 'is_sponsored',
'orderby' => 'meta_value date'
);
- * orderbyはmeta_valueとdateの2つの属性を取ります*
したがって、クエリに上記の引数を指定した$ wpdb-> requestは次のようになります。
SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID
FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->postmeta
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE 1=1
AND $wpdb->posts.post_type = 'sfpposts'
AND ($wpdb->posts.post_status = 'publish')
AND ($wpdb->postmeta.meta_key = 'is_sponsored' )
GROUP BY $wpdb->posts.ID
ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC
LIMIT 0, $per_page
そして最後に、meta_valueで並べ替えることもできるように、クエリは1つの小さな違いだけで設定する必要があります。
SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID
FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->postmeta
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE 1=1
AND $wpdb->posts.post_type = 'sfpposts'
AND ($wpdb->posts.post_status = 'publish')
AND ($wpdb->postmeta.meta_key = 'is_sponsored' )
GROUP BY $wpdb->posts.ID
ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC
LIMIT 0, $per_page
[!ORDER MISSING!]プレースホルダーを見つけてください。上記は問題が正確に発生する場所を説明していると思います。