これはかなり一般的な問題のように思えますが、私はまだ問題の解決策をここで見つけることができないのでこれを投稿しています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回目の試行:;-)
pre_get_posts
はparse_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
フィルタを介してそれに対応する必要があります。
current_time('mysql')
の代わりにtime()
を使用してください。
time()
はunixタイムスタンプ(整数)を返し、current_time('mysql')
はmysqlタイムスタンプを返します。