「先頭に固定表示」の記事をトップページ以外で表示させない
-
ある記事をブログのタイトル用にして、「先頭に固定表示」オプションを使って常時ブログの先頭に表示させています。ただ、「先頭に固定表示」の機能はトップページのみに効果があり、タイトル用の記事はオリジナルが2ページ目以降に残った状態となってしまっています。
これではブログの記事の中にタイトル用の記事が再度突然登場することになり、格好が悪いので、なんとか「先頭に固定表示」した記事はトップページ以外で表示させたくないのですが、どうすれば良いでしょうか。
query_postsを使って実現できそうなのですが、難しくて苦戦中です。
カスタマイズについて、アドバイスをいただければ幸いです。
-
こんにちは。
考え方を変えて
「タイトル用に使いたい記事」を固定ページで作成し、
「設定」→「表示設定」で「フロントページの表示」を「固定ページ」にし、
「フロントページ」で先ほど作った固定ページを指定する方法ではダメですか?
(その際、投稿のアーカイブを表示させる用の固定ページも作成しておいて
「投稿ページ」に割り当てるとベスト)プラスして、サイトのトップにも投稿を、表示させるのであれば、
テンプレートをカスタマイズすれば可能です。「先頭に固定表示」の投稿はトップページで有効になりますので、
2ページ目以降にでてきたり、トップページ以外で先頭にでてくることはないのがデフォルトの仕様と思います。
テーマ側でなにかカスタマイズしているのでは…
テーマは自作でしょうか?gatespaceさんのアドバイス
>「タイトル用に使いたい記事」を固定ページで作成
もよい方法と思います。sysbird さん>
いま、WordPress 3.4.1 +Twenty Elevenで確認しましたが、
1ページに表示する最大投稿数によっては2ページ目以降にも出てきます。
(1ページに表示する最大投稿数が10の時で「先頭に固定表示」した記事が11件目以降の時など)「先頭に固定表示」した記事が11件目以降の時はたしかに2回表示されていますね。
私の確認不足でした。>gatespace さん、
この仕様ずっとまちがって理解してたので、助かりました!こんにちは、
なるほどと思いましたので、参加させてください。
テンプレートのループ部分でpost_class()にクラスを追加します。
if(have_posts()){ raindrops_loop_title(); while (have_posts()){ the_post(); $raindrops_add_class = array(); if( is_sticky() ){ $raindrops_add_class = array( 'raindrops-sticky' ); } ?> <li> <div id="post-<?php the_ID(); ?>" <?php post_class( $raindrops_add_class ); ?>>
あとは、style.cssで表示のコントロールをします。
.raindrops-sticky{ display:none; } .sticky.raindrops-sticky{ display:block; }
変なプレフィックスは、適当に変更してください
ども。
一番最初に私が投稿した方法が簡単なんですが、こんな方法もありますよ〜。ぐらいで。手順としては
- 「先頭に固定表示」の投稿のみをget_posts(またはWP_Query)で取得して表示
- メインクエリから「先頭に固定表示」の投稿のみ除外
です。
1.は表示したい場所(テンプレートファイル)内に記述してください。
(ほとんどCodexのWP_Queryの内容そのままです)
タイトルや投稿の表示の仕方はご自由に。$sticky_posts_arg = array( 'posts_per_page' => -1, 'post__in' => get_option( 'sticky_posts' ), 'ignore_sticky_posts' => 1 ); $sticky_query = new WP_Query( $sticky_posts_arg ); if ( $sticky_query->have_posts() ) { while ( $sticky_query->have_posts() ) : $sticky_query->the_post(); // ここで投稿を表示 get_template_part( 'content' ); // Twenty Elevenと同じです。 endwhile; } wp_reset_postdata(); // リセット
2.は is_main_query と pre_get_posts フックを使って、
メインクエリの取得時にクエリの内容を書き換えます。
テーマのfunctions.phpに追記してください。function pre_get_posts_functions( $wp_query ) { if (!is_admin()) { // 管理画面以外で // フロントページのメインクエリでは先頭に固定表示を含めない if ( $wp_query->is_main_query() && $wp_query->is_home() ) { $wp_query->set( 'post__not_in', get_option( 'sticky_posts' ) ); } } } add_action( 'pre_get_posts', 'pre_get_posts_functions' );
is_main_query は3.3以降で使える関数ですが、3.2以前でも同様のことが可能です。
参照元:3.3の新しい関数 is_main_query を使おうこれらのコードのメリットは、「先頭に固定表示」したい投稿が複数ある場合や、
手を加えることで、カテゴリーアーカイブ等でも使えることです。皆様
的確なアドバイスをあっという間にいただきありがとうございます。
解決策が豊富にあるので、全てを試して、私のサイトに合う一番良い方法を採用したいと思います。今回のこの疑問は、ネット上では意外にまだ提示されていませんでしたので、この投稿が今後の方々の役に立てれば幸いです。
何より、素晴らしい解決策を提示していただいたgatespaceさんとnobitaさんに大感謝です。
皆様
一度解決したと思ったのですが、どうにもうまくいきませんので、より詳しくコードなども記述してみます。
現在、get_postsで取得して表示の方法を試しています。
現在、次のphpがあります。
・functions.php
・content.php
・index.phpfunctions.phpは次のコードを記載しています。
<?php function pre_get_posts_functions( $wp_query ) { if (!is_admin()) { // 管理画面以外で // フロントページのメインクエリでは先頭に固定表示を含めない if ( $wp_query->is_main_query() && $wp_query->is_home() ) { $wp_query->set( 'post__not_in', get_option( 'sticky_posts' ) ); } } } add_action( 'pre_get_posts', 'pre_get_posts_functions' ); ?>
次に、index.phpに次のコードを記載しています。
<?php get_header(); ?> <?php $sticky_posts_arg = array( 'posts_per_page' => -1, 'post__in' => get_option( 'sticky_posts' ), 'ignore_sticky_posts' => 1 ); $sticky_query = new WP_Query( $sticky_posts_arg ); if ( $sticky_query->have_posts() ) { while ( $sticky_query->have_posts() ) : $sticky_query->the_post(); // ここで投稿を表示 get_template_part( 'content' ); // Twenty Elevenと同じです。 endwhile; } wp_reset_postdata(); // リセット ?> <?php get_footer(); ?>
そして、content.phpには次のコードを記載しています。
<div id="content"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div align="center" class="image"> <?php the_content('続きを読む'); ?> </div> <?php endwhile; ?> <?php else : ?> <div align="center">No ART TO SEE YET</div> <?php endif; ?> </div>
functions.phpはうまく働いて、「先頭に固定表示」の記事を消すことができました。しかし、index.phpに記載したコードが上手く動かず、「先頭に固定表示」の投稿を取得できずにいます。
ちなみに、今私が作ろうとしているサイトはとても簡易的なブログで、作品を文字もタイトルもなしにただ投稿できるサイトです。ですから、コードは非常に単純にしています。
何が原因で動かないのかで苦戦しております。
再三となりますが、アドバイスをいただければと思います。こんにちは
サーバサイドで、stickyを2回表示しないほうほうの、簡単なやつ
<?php if(have_posts()){ while (have_posts()){ the_post(); $class_array = get_post_class(); if( ! is_sticky() or in_array( 'sticky', $class_array ) ){ ?> <li> <div id="post-<?php the_ID(); ?>" <?php post_class( ); ?>> .........いろいろ </div> </li> <?php }?> <?php } //end while ?> }//if have_posts ?>
CSSで処理する事も出来るし、ソースから消す事も出来るわけですが、私的には、同じコンテンツを2度表示しないというのがワードプレスの仕様なら、ソースから見えたほうが、検索エンジンでも拾ってもらえるし、ユーザーが、カスタマイズしたいというニーズがある時に、カスタマイズのハードルも下がるので、UIとしても見えなければ、「かっこ悪くない」んじゃないかなと思って
自分のRaindropsというテーマに反映させようと思っているのですが、
ソース消したほうがいい という意見があれば、参考にしたいので教えてください。
euurekaさん
index.phpでループを作っているのに、
さらにその中(で読み込まれたcontent.php)でまたループになっているのが問題かと。
また、このindex.phpだと永遠にメインクエリが表示されないので注意が必要です。
Twenty Elevenのとご自分のテーマとを比べてみてください。index.php
<?php get_header(); ?> <?php // 先頭に固定表示の記事を取得 $sticky_posts_arg = array( 'posts_per_page' => -1, 'post__in' => get_option( 'sticky_posts' ), 'ignore_sticky_posts' => 1 ); $sticky_query = new WP_Query( $sticky_posts_arg ); if ( $sticky_query->have_posts() ) { // 先頭に固定表示の記事があったら while ( $sticky_query->have_posts() ) : ループ開始 $sticky_query->the_post(); // ここで投稿を表示(ループ) get_template_part( 'content', 'sticky' ); // content-sticky.phpを読み込む(無ければcontent.php) endwhile; } else { // 該当する投稿がなかった場合 echo "<div>Not found</div>"; } wp_reset_postdata(); // リセット ?> <?php // メインクエリ if ( have_posts() ) : // メインクエリがあったら ?> while ( have_posts() ) : // ループスタート the_post(); get_template_part( 'content' ); endwhile; // ナビゲーションはこの辺に else : // 該当する投稿がなかった場合 echo "<div>Not found</div>"; endif; ?> <?php get_footer(); ?>
content.php
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <div align="center" class="image"> <?php the_content('続きを読む'); ?> </div> </div>
- トピック「「先頭に固定表示」の記事をトップページ以外で表示させない」には新たに返信することはできません。