web-dev-qa-db-ja.com

投稿メタによるカスタム投稿管理フィルタリング(日付)

カスタムフィールドを使用してイベントの日付を取得する、イベントのカスタム投稿タイプを作成しました。正常に動作し、meta_compareを使用して表示された結果をフィルタリングし、日付値を現在の日付と比較できます。

ここまでは順調ですね。また、meta compareフィルターを介して、pre get postsを削除することにより、将来または過去のイベントのいずれか(またはその両方)を表示するように管理エンドをフィルター処理できます。

私がやりたいのは、過去のイベントを表示する管理ページを作成することです。次のコードを使用してページ(およびメニュー項目)を作成しました。

add_action('admin_menu', 'add_concerts_page');
function add_concerts_page() {
    add_submenu_page('edit.php?post_type=concerts', 'Concerts Archive', 'Concerts Archive', 'manage_options', 'concerts-archive', 'my_archive_function' );
}

function my_archive_function() {}

しかし、関数の書き方がわかりません!!フロントエンドで行うように、通常のループを記述して結果をフィルター処理できますが、行う必要があるのは、通常の管理ページと同じ情報を表示することですが、それ以降に通過したイベントを表示することです。

これは、将来のイベントのみを表示するためにカスタム投稿編集画面をフィルタリングする方法です。

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

      }
    }
  }
}
add_filter('pre_get_posts' , 'concerts_pre_get_posts');

過去のイベント用に個別のアーカイブページを作成する必要は本当にありません。このページで過去のイベントから将来のイベントにクエリを切り替えるリンクはグルーヴィですが、これを実行する方法がわかりません。

すべての助けに感謝します!

2
Richard Sweeney

あなたはYYYY-MM-DDのようなソート可能なフォーマットで、あるいはunixタイムスタンプとしてあなたの日付を保存する必要があります。 YYYY-MM-DDという形式になったら、これでうまくいくはずです。これを試して:

function concerts_pre_get_posts( $query ) {
    if ( !is_admin() )
        return;

    if ( isset( $query->query_vars[ 'post_type' ] ) && $query->query_vars[ 'post_type' ] == 'concerts' ) {
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', array(
            array(
                'key' => 'date_value',
                'value' => date( "Y-m-d" ),
                'compare' => '<=',
                'type' => 'DATE'
            )
        ) );
    }
}
add_filter( 'pre_get_posts', 'concerts_pre_get_posts' );
2
dwenaus