web-dev-qa-db-ja.com

カスタムフィールドとして保存された日付を使用してadminに表示される投稿を絞り込む

これはかなり一般的な問題のように思えますが、私はまだ問題の解決策をここで見つけることができないのでこれを投稿していますWP Answers - どんな助けでも大歓迎です!

[OK]を - 私はカスタムフィールドを使用してイベントの日付をキャプチャし、UNIXタイムスタンプとして保存する 'イベント'のカスタム投稿タイプがあります。フロントエンドでの投稿のフィルタリングは、将来のイベントのみを表示するために次のコードを使用しても問題ありません。

$events = new WP_Query( 'post_type=events&posts_per_page=-1&meta_key=date_value&orderby=meta_value&meta_compare=>=&meta_value='.time().'&order=ASC' );

私はpre_get_postsフィルタを使用して同じ方法で管理者で結果をフィルタしようとしました:

function events_pre_get_posts($query) {
  if (is_admin()) {
    if (isset($query->query_vars['post_type'])) {
      if ($query->query_vars['post_type'] == 'events') {
          $query->set('meta_key', 'date_value');
          $query->set('orderby', 'meta_value');
          $query->set('meta_compare', '>=');
          $query->set('meta_value', time());
          $query->set('order', 'ASC');
      }
    }
  }
}
add_filter('pre_get_posts' , 'events_pre_get_posts');

しかし、管理者にこのコードは私のすべての投稿が消えるようになります!

私はまたバックエンドで過去のイベントを表示する方法を見つけようとしています、そして私も本当にそこで立ち往生しています!私はこれをする最善の方法を確信していません - おそらく過去/将来のイベントを見るために 'イベント'投稿ページをトグルします。

助けて!!

2
Richard Sweeney

2回目の試行:;-)

pre_get_postsparse_query()の後に実行されます。 parse_query()は、 'meta_key'などを 'meta_query'に変換します。 get_posts()は 'meta_key'などに直接反応しないようです。 $query->parse_query()の呼び出しの後に$query->set()を追加するか、parse_queryの前に実行されるフィルタを使用してください(編集、parse_query()フィルタも機能しません - 実行が遅すぎる)。

編集:を切り替えるには

function my_timeswitch() {
    $operators = array(
        '>=' => 'future',
        '<=' => 'past'
    );
    ?>
    <select name='meta_compare'>
        <?php
            foreach ($operators as $k => $v) {
                printf( "<option %s value='%s'>%s</option>\n", selected($_GET['meta_compare'], $k, false), esc_attr($k), __($v));
            }
        ?>
    </select>
    <?php
}
add_action('restrict_manage_posts', 'my_timeswitch');

これだけでうまくいくかもしれません。そうでない場合は、名前を別の名前に変更し、query_varsフィルタを介して新しいパブリッククエリ変数を登録してから、parse_queryフィルタを介してそれに対応する必要があります。

2
wyrfel

current_time('mysql')の代わりにtime()を使用してください。

time()はunixタイムスタンプ(整数)を返し、current_time('mysql')はmysqlタイムスタンプを返します。

0
wyrfel