WordPressで「先頭に固定表示」が効かない場合の対処法

WordPress

「先頭に固定表示」が効かない主な原因とは?

WordPressの投稿編集画面で「先頭に固定表示」にチェックを入れたのに、トップページや一覧に反映されない……。

この機能は本来、特定の記事を常に一覧の先頭に表示するための便利な仕組みですが、実際には「テーマのテンプレート構造」や「カスタムクエリの書き方」によって動作しないケースが多くあります。
特に、WP_Query()get_posts() を使って独自のループを組んでいるテーマでは、WordPressの標準的な固定表示処理(sticky posts)が無効化されていることがよくあります。

この記事では、「先頭に固定表示」が効かないときに考えられる主な原因と、その具体的な対処法をコード例つきで解説します。
チェックリスト形式で確認できるようにまとめていますので、テーマ編集やカスタマイズの前に一度見直してみましょう。

「先頭に固定表示」とは?

WordPressの「先頭に固定表示」とは、特定の投稿を一覧の一番上に表示するための機能です。
通常、投稿一覧は「公開日の新しい順」で並びますが、固定表示に設定した投稿は日付に関係なく、常に他の記事より上に表示されます。

例えば
  • 告知したいキャンペーン情報
  • 人気記事やお知らせ
  • 重要なイベント情報

などを目立たせたい場合に便利です。

この設定は、投稿編集画面の「ステータスと公開状態」エリア(または右サイドバーの公開設定)で、「先頭に固定表示」にチェックを入れるだけで簡単に有効化できます。

「先頭に固定表示」にチェックを入れる

ただし、この機能は WordPressの標準ループ(メインクエリ) に対してのみ有効です。
テーマファイル内で get_posts()WP_Query() を使って独自に投稿を取得している場合は、設定しても反映されないことがあります。

つまり、「先頭に固定表示」を正しく機能させるためには、テーマのクエリ構成(投稿の取得方法) が大きく関係している、という点を理解しておくことが重要です。

「先頭に固定表示」が効かない主な原因とは?

「先頭に固定表示」にチェックを入れているのに反映されない場合、多くは テーマのクエリ設定や投稿の取得方法 に原因があります。

特に以下のようなケースでは、WordPressの標準的な固定表示の仕組みが無視されてしまうことがあります。

主な原因一覧

  • get_posts() を使っている
    get_posts() はデフォルトで「固定表示」を無視する仕様になっています。
  • query_posts() を使っている
    → メインクエリを上書きしてしまい、「先頭に固定表示」が効かなくなることがあります。
  • ③ カテゴリーやタグで絞り込みをしている
    → 絞り込み条件によって、固定表示の投稿が除外される場合があります。
  • ④ テーマのループがメインクエリではない
    archive.phpcategory.php などで独自の WP_Query を使っている場合、
    デフォルトの固定表示処理が働かないことがあります。
  • ⑤ クエリパラメータの設定ミス
    ignore_sticky_posts の値を true にしていると、固定表示は無効になります。
  • ⑥ キャッシュやパーマリンクの影響
    → 表示が更新されないだけで、設定自体は反映されている場合もあります。

この中でも特に多いのが ①〜④のクエリ関連の問題
固定表示が効かないときは、まず自分のテーマでどの関数を使って投稿を取得しているかを確認するのがポイントです。

次のセクションでそれぞれの解決方法を解説します。

主な原因と対処法

ここでは、「先頭に固定表示」が効かない主な原因と、その対処法をケース別に解説します。
実際のテーマ編集やテンプレートカスタマイズでつまずきやすいポイントも整理しています。

1. get_posts() の使用

get_posts() は手軽に投稿を取得できる関数ですが、デフォルトで「ignore_sticky_posts」=> true になっており、固定表示された投稿を無視してしまいます。

対処法

$args = array(
  'posts_per_page' => 5,
  'ignore_sticky_posts' => false, // ← これを追加
);
$posts = get_posts($args);

この1行を加えるだけで、「先頭に固定表示」が有効になります。

2. query_posts() の使用

query_posts() はメインクエリを上書きしてしまうため、テーマやプラグインとの兼ね合いで予期せぬ動作になることがあります。
特にカテゴリー絞り込みやカスタム投稿タイプの一覧で、固定表示が効かなくなることも。

対処法

  • pre_get_posts フックで条件を追加する
  • もしくは安全な WP_Query() に書き換える

例(WP_Query へ書き換え):

$args = array(
  'post_type' => 'post',
  'ignore_sticky_posts' => false,
);
$query = new WP_Query($args);

3. WP_Query() での独自クエリ

WP_Query() は新しいクエリを生成するため、デフォルトでは「先頭に固定表示」を自動で反映しません。
特に、トップページの「イベント一覧」や「お知らせ」などを独自クエリで表示している場合にこの問題が起こりやすいです。

対処法

固定投稿を明示的に取得し、その後通常投稿を出す構成にします。

$sticky = get_option('sticky_posts');

if (!empty($sticky)) {
  // 固定投稿を先に出力
  $sticky_args = array(
    'post__in' => $sticky,
    'ignore_sticky_posts' => 0,
    'orderby' => 'post__in',
    'posts_per_page' => 3,
  );
  $sticky_query = new WP_Query($sticky_args);
}

また、固定記事と通常記事が重複しないように、
通常のクエリ側では 'post__not_in' => $sticky を指定するのがポイントです。

例)固定表示投稿を優先して、合計3件だけ表示するコード

<?php
// 固定表示されている投稿IDを取得
$sticky = get_option('sticky_posts');

// 最終的に表示する投稿を入れる配列
$display_ids = array();

// 固定投稿がある場合はまず取得
if (!empty($sticky)) {
  $sticky_args = array(
    'post_type' => 'post',
    'post__in' => $sticky,
    'posts_per_page' => 3,
    'orderby' => 'date',
    'order' => 'DESC',
  );
  $sticky_query = new WP_Query($sticky_args);

  if ($sticky_query->have_posts()) {
    while ($sticky_query->have_posts()) {
      $sticky_query->the_post();
      $display_ids[] = get_the_ID(); // IDを記録
    }
  }
  wp_reset_postdata();
}

// 固定投稿が3件未満なら、残りを通常投稿で補う
$remaining = 3 - count($display_ids);
if ($remaining > 0) {
  $normal_args = array(
    'post_type' => 'post',
    'posts_per_page' => $remaining,
    'post__not_in' => $display_ids, // 重複防止
    'ignore_sticky_posts' => 1,
    'orderby' => 'date',
    'order' => 'DESC',
  );
  $normal_query = new WP_Query($normal_args);

  if ($normal_query->have_posts()) {
    while ($normal_query->have_posts()) {
      $normal_query->the_post();
      $display_ids[] = get_the_ID();
    }
  }
  wp_reset_postdata();
}

// 最終的にまとめて出力
if (!empty($display_ids)) {
  $final_query = new WP_Query(array(
    'post_type' => 'post',
    'post__in' => $display_ids,
    'orderby' => 'post__in', // 登録順で表示
  ));

  if ($final_query->have_posts()) :
    while ($final_query->have_posts()) : $final_query->the_post(); ?>

      <!-- ▼ここから出力部分(ダミー)▼ -->
      <div>
        <a href="<?php the_permalink(); ?>">
          <h3><?php the_title(); ?></h3>
          <p><?php echo get_the_date(); ?></p>
        </a>
      </div>
      <!-- ▲ここまでダミー出力▲ -->

    <?php endwhile;
  endif;
  wp_reset_postdata();
}
?>

4. カテゴリーやタグでの絞り込み

カテゴリーやタグで絞り込みを行うと、固定表示の投稿が条件に合わず除外されてしまうことがあります。

原因例

$args = array(
  'category_name' => 'news',
);

このような指定があると、sticky投稿がそのカテゴリに属していない場合は除外されます。

対処法

post__in に sticky ID を指定して、明示的に含めるようにします。

5. テーマのループ設定やテンプレートの影響

home.phparchive.php などでメインクエリを変更している場合、固定表示が反映されないことがあります。

また、wp_reset_query()wp_reset_postdata() の呼び忘れも、意図しない結果を引き起こす原因になります。

対処法

必要に応じて wp_reset_query(); を使ってクエリを初期化する
テンプレートの最後で wp_reset_postdata(); を入れる

まとめ|問題解決のためのチェックリスト

「先頭に固定表示」が効かない場合、多くはクエリや設定の影響によるものです。
以下のチェックリストを順に確認してみましょう。

  • 投稿設定の確認
    該当の投稿で「先頭に固定表示」にチェックが入っているかを確認。
  • テーマテンプレートの記述を確認
    query_posts()get_posts() を使っていないかチェック。使っている場合は、WP_Query へ変更または ignore_sticky_posts の指定を見直しましょう。
  • ignore_sticky_posts の設定
    ignore_sticky_posts => true になっていないか確認。必要に応じて false に変更します。
  • カテゴリー・タグ絞り込み時の除外設定
    カテゴリーやタグでフィルタリングしている場合、post__not_in などで sticky 投稿が除外されていないか確認します。
  • キャッシュの影響を除外
    キャッシュ系プラグインやテーマキャッシュをクリアして、最新の状態を反映させます。
  • パーマリンクのリフレッシュ
    「設定」→「パーマリンク設定」で「変更を保存」をクリックし、リライトルールを再生成します。
  • WP_Query 利用時の明示的な指定
    独自クエリを使う場合は、以下のように手動で sticky 投稿を含める設定を行います。
$sticky = get_option('sticky_posts');
$args = array(
  'post__in' => $sticky,
  'ignore_sticky_posts' => 0,
  'orderby' => 'post__in',
);
$query = new WP_Query($args);

このチェックを順に行えば、ほとんどの「先頭に固定表示」トラブルは解決できます。

この記事を書いた人
管理人

2012年にWebデザインの勉強を始め、2013年より制作会社に勤務。
これまでに500件以上のWebサイト制作・運用に携わってきました。
現在も制作会社に勤務しながら、Webデザインスクールのトレーナーとしても後進の育成に取り組んでいます。
WordPressやデザインの実践的なノウハウを、初心者にもわかりやすく発信できるよう試行錯誤しています。

管理人をフォローする
WordPress
スポンサーリンク
管理人をフォローする

コメント

タイトルとURLをコピーしました