$args = array(
'cat' => 5,
'posts_per_page' => 8,
'meta_key' => 'custom_sort_order',
'order' => 'ASC',
'orderby' => 'meta_value_num'
);
$custom_query = new WP_Query( $args );
上記のコードを使用して、カスタムフィールドの値の順序で昇順に投稿を並べ替えることができます。しかし、カスタムフィールドのキーと値を投稿に割り当てるのを忘れた場合、custom_sort_order
meta_keyのために、クエリで投稿全体を見つけることができません。これは、その投稿には存在しないためです。
しかし、コーデックスが言っているので、私はそこに'meta_key' => 'custom_sort_order'
を置く必要があります。
'meta_value_num'
- 数値によるメタ値順(バージョン2.8で利用可能)。また、クエリには'meta_key=keyname'
も必要です。
それを迂回して、クエリでデフォルトのソート順を設定することはできますが、昇順の数字を持つcustom_sort_order
meta_keyでそれらを操作することはできますか。そのため、たとえcustom_sort_order
post_metaについて言及するのを忘れたとしても、その投稿は通常通りにクエリされます。
@ heathenJesusが回答し、@ engelenがコメントした後は、このトピックを難しいやり方で扱っているようです。カスタムのcustom_sort_order meta_keyを使ってカスタムのWP_Query()を変更することができるフィルタについて考えることができますか?
WP_Queryの引数が次のようになっていたとします。
$args = array(
'cat' => 5,
'posts_per_page' => 8,
'meta_key' => 'other_post_meta',
'meta_value' => 'yes',
'order' => 'ASC'
);
$custom_query = new WP_Query( $args );
'orderby' => 'meta_value_num'
を除外し、他のmeta_keyとそれぞれの値でクエリをフィルタリングしました。しかしcustom_sort_order
meta_keyはありません。ある種のフィルタを実装し、カスタム値custom_sort_order
を使って外部的に順序を変更します。
そのように考えることができますか?
実際、私たちは質問することができます:「ポストタイプリオーダープラグインはどのようにしてそれをやったのですか?」
短い答え:できません。とにかく、そうではありません。
ただし、そのカスタムフィールドの有無に関係なく、クエリからすべての結果を取得し、完全に並べ替えずに、PHP関数uksort
を使用して並べ替えることができます。 )http://us1.php.net/manual/en/function.uksort.php
何かのようなもの:
$args = array(
'cat' => 5,
'numberposts' => 8
);
$posts = get_posts($args);
uksort($posts,"sort_posts_by_custom_order");
function sort_posts_by_custom_order($a,$b)
{
$custom_a = get_post_meta($a->ID,'custom_sort_order',true);
$custom_b = get_post_meta($b->ID,'custom_sort_order',true);
$custom_a = isset($custom_a) ? $custom_a : -1;
$custom_b = isset($custom_b) ? $custom_b : -1;
if ($custom_a == $custom_b) { return 0; }
return ($custom_a < $custom_b) ? -1 : 1;
}
1回のDB呼び出しを行うよりも間違いなくはるかに費用がかかりますが、これはデータの矛盾に対して支払う料金です。