web-dev-qa-db-ja.com

Orderby 'meta_value_num'をOPTIONALにする方法?

$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を使って外部的に順序を変更します。

そのように考えることができますか?

実際、私たちは質問することができます:「ポストタイプリオーダープラグインはどのようにしてそれをやったのですか?」

2
Mayeenul Islam

短い答え:できません。とにかく、そうではありません。

ただし、そのカスタムフィールドの有無に関係なく、クエリからすべての結果を取得し、完全に並べ替えずに、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呼び出しを行うよりも間違いなくはるかに費用がかかりますが、これはデータの矛盾に対して支払う料金です。

1
heathenJesus