標準投稿で使える「この投稿を先頭に固定表示」ですが、デフォルトではカスタム投稿では使えず。
プラグインや関数ファイルでの記述で使えるようにはできますが、細かい制御ができずなかなか思うようにいかない。
更に、「期日を指定して先頭に固定を解除したい」とのご要望。
うーむややこしい。何か策は無いか?と思案した際のメモ。
「先頭に固定」をカスタムフィールドにする
カスタムフィールドのラジオボタン「先頭に固定する」を追加。設定を下記のようにします。
- ラジオボタンの選択肢:1-しない、2-する
- 必須
- デフォルト値:1
フラグが立っていない記事は表示されないのでラジオボタンにしています。
記事インポートの際は、
- すべての記事を保存しなおす
- 「Really Simple CSV Importer」等でインポート時にフィールド値を更新させる
等が必要になります。
出力設定での並び替え
例えば、投稿タイプ「news」、カスタムフィールドのキー「custom_sticky」なら、出力の条件をこんな感じに。
'post_type' => 'news',
'meta_key' => 'custom_sticky',
'orderby' => array(
'meta_value_num' => 'DESC',
'post_date' => 'DESC',
),
これで並び順は、
- 先頭に固定する(新)
- 先頭に固定する(旧)
- 先頭に固定しない(新)
- 先頭に固定しない(旧)
となると思います。
- 特定の箇所に反映したければサブループやショートコードなどの構文に
- メインクエリをいじりたければfuctionsに追記
等でコントロールします。
先頭への固定を、任意の期日で解除したい
指定の期日が過ぎたら非公開にする、または削除する、とかならば、プラグイン「Post Expirator」あたりで出来ます。
カテゴリー変更も出来た気がする。
イベント情報など、期日を過ぎたら要らなくなる内容ならば良いのですが、
今回はそうじゃない
ので、ラジオボタン「先頭に固定する」の代わりにデートピッカー「期限日設定」を設置。
$today = strtotime( date( 'Y-m-d' ) );
if( get_field( 'sticky_due' ) ){
$sticky_due = strtotime( get_field( 'sticky_due' ) );
$sticky_class = ' sticking';
}else{
add_post_meta( $post->ID, 'sticky_due', '2000-01-01' );
$sticky_due = strtotime( get_field( 'sticky_due' ) );
$sticky_class = '';
}
if( $today > $sticky_due ){
update_post_meta( $post->ID, 'sticky_due', '2000-01-01' );
$sticky_class = '';
}
ACF Proのデートピッカーはデフォルト値が設定できないので、処理を書いたサブループなりショートコードを表示させるとフィールド値が更新されるようにしています。
- 期限日が設定されていない場合、フィールド値「2000-01-01」を加えます。
- 期限日が過去になった場合、フィールド値を「2000-01-01」に書き換えます。
- 日にち単位で比較、期限当日いっぱい先頭に固定されます。
- 見た目に変化を加えないと「並び順がおかしくなってる」としか見えません。
articleや日付等のクラスに「$sticky_class」を出力し、アイコンを付ける等してください。
出力設定は大体同じ。
meta_keyだけ変更します。
'post_type' => 'news',
'meta_key' => 'sticky_due',
'orderby' => array(
'meta_value_num' => 'DESC',
'post_date' => 'DESC', )
)
- 先頭に固定する(設定期日が新しい)
- 先頭に固定する(設定期日が古い)
- 先頭に固定しない(公開日が新しい)
- 先頭に固定しない(公開日が古い)
こんな感じに並ぶはず。
期日の設定期間によっては1と2が公開日順と矛盾しますが、
長期間表示したいなら「固定コンテンツにすれば?」と進言しましょう。
さらにさらに
期限を指定した投稿だけをサブループに出したい、とな!
そんなの、「ピックアップ」か何かのスイッチだけでいいんじゃない?と思いますが、ご要望なので。
$today = strtotime( date( 'Y-m-d' ) );
if( get_field( 'sticky_due' ) ){
$sticky_due = strtotime( get_field( 'sticky_due' ) );
$sticky_class = ' sticking';
add_post_meta( $post->ID, 'sticky_status', 'true' );
if( $today > $sticky_due ){
delete_post_meta( $post->ID, 'sticky_status' );
$sticky_class = '';
delete_post_meta( $post->ID, 'sticky_due' );
}
}
ON/OFFだけのカスタムフィールド「sticky_status」を追加します。
※任意に変更することは無いので、UIに加える必要はありません。
'meta_key'=> 'sticky_due',
'orderby'=> array(
'meta_value_num' => 'DESC',
'post_date' => 'DESC',
),
'meta_query' => array(
array(
'key' => 'sticky_status',
'value' => 'true',
'compare' => 'IN'
)
)
2度と使わないような気はしますが、また1から考え直すのも嫌なのでメモメモ。