web関連

【wordpress】「この投稿を先頭に固定表示」のせいで表示が崩れた時の備忘録

【wordpress】「この投稿を先頭に固定表示」のせいで表示が崩れた時の備忘録

お客さんからトップページの表示が崩れていると電話があって確認したら「この投稿を先頭に固定表示」のせいで崩れていた。

「この投稿を先頭に固定表示」は件数を指定していても無視して出力される

「この投稿を先頭に固定表示」をチェックした記事は「posts_per_page」とかで記事数を指定しても無視して出力されてしまうので調整した時のコード

<?php 
	$list_cnt = 5;
	$sticky = get_option('sticky_posts');
	if ($list_cnt <= count($sticky)) {
		// 「先頭固定」が「$list_cnt」に設定した数値と同じ又は超えた時の記述
		$args = array(
			'posts_per_page' => '5',
			'post_type' => 'post',
			// 「この投稿を先頭に固定表示」の無効化
			'ignore_sticky_posts' => true,
		);
	}else{
		// 「先頭固定」が「$list_cnt」を超えてない時
		// 「$list_cnt」から「先頭固定」の数を引いた数最新記事出力
		if ( !empty($sticky) ) $list_cnt -= count($sticky);
		$args = array(
			'posts_per_page' => $list_cnt,
			'post_type' => 'post',
		);
	}
	$the_query = new WP_Query($args);
	if ( $the_query->have_posts() ) :
	while ( $the_query->have_posts() ) : $the_query->the_post();
?>

ここに出力するコード

<?php endwhile; ?>
<?php else: ?>
<?php endif; ?>

「この投稿を先頭に固定表示」の数を取得して、「$list_cnt」に指定した数から引いて余った数だけ最新の記事を出力しています。
ただ、「この投稿を先頭に固定表示」が「$list_cnt」に指定した数値と同じ又は超えたときは「’ignore_sticky_posts’ => true」で「この投稿を先頭に固定表示」を無効化しています。
超えると全件表示されちゃうんだよ…
表示崩れだけは防ぐのが趣旨

▼参考記事
https://office7f.com/2015/07/16/wp_query/

そもそも「’ignore_sticky_posts’ => true」って?

「この投稿を先頭に固定表示」をチェックした記事があろうと新しい記事があれば関係なく上書きする、
「この投稿を先頭に固定表示」の先頭固定を無効化するやつ
トップに新着1件しか出さないサイトがあって、「この投稿を先頭に固定表示」があると困るので使用

<?php 
	// 1件だけ表示したい「この投稿を先頭に固定表示」を無効化
	$args = array(
	'posts_per_page' => '1',
	'ignore_sticky_posts' => true,
	);
?>

そもそも管理画面に表示させない方法

functions.phpに記述

function remove_sticky_posts() {
    echo '<script>if(typeof jQuery != "undefined"){jQuery(function(){jQuery("#sticky-span").remove();})}'."n".'</script>';
}
add_action( 'admin_head', 'remove_sticky_posts' );

参考記事通り貼りつけたらうまくいかなかったからちょっと修正
クイック編集しようとすると見えちゃうけどwordpressのデフォルトの機能なんで使えなくするってのがちょっとどうかとおもうんだよね

▼参考記事
https://macoblog.com/wp_query_layout_crush/

20190708追記:最新記事を先頭固定表示にすると記事数が一つ少なくなる

最新記事に先頭固定表示のチェックをつけておくと一覧に出る記事数が1つ減ってしまった
どうにも「通常の記事」と「先頭固定表示がついた記事」で2記事分でカウントされているっぽい

どうするのかわからないけど最新記事のID拾ってきて先頭固定のチェックついているかどうか条件分岐させたりするのかなぁ…

この辺が参考になりそう

WordPressで最新記事のIDを取得するコード

「この投稿を先頭に固定表示」の扱い思っていたよりめんどくさい