LABE
フォーラムへの返信
-
フォーラム: 使い方全般
返信が含まれるトピック: カテゴリーのスラッグを使った条件分岐で画像表示させたいget_the_category()ではなくget_categories()ですね。
だいたい以下のような感じになります。<?php global $wp_query; $cat = $wp_query->get_queried_object(); $child_cats = get_categories('hide_empty=0&parent='.$cat->term_id); foreach ( $child_cats as $child_cat ): ?> <?php if ( $child_cat->slug === 'slug001' ): ?> <p><img src="http://XXXXXXX/XXXXXXXXXX"></p> <?php elseif ( $child_cat->slug === 'slug002' ): ?> <p><img src="http://AAAAAAAA/AAAAAAAAA"></p> <?php else: ?> <p><img src="images/no_image.gif" alt="画像はありません"></p> <?php endif; endforeach; ?>4行目でその関数を使っていますが、
hide_empty=0は「投稿が一つも属さないカテゴリも取得する」という意味なので、取得したくない場合はhide_empty=1にしてください。フォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたいASC(Ascending Order:昇順)、昇っていく順、というのは日付では古い順だと思っていたのですが、勘違いだったんでしょうかね……
一つ前の記事=現在の記事より古い記事のうち、新しい順に一つ目の記事
一つ後の記事=現在の記事より新しい記事のうち、古い順に一つ目の記事
というクエリを作っていたわけですが、俺はしばしばASCとDESCを逆に書いてしまうようで。
俺によほどセンスがないのか、何かバグがあるのか……
ともあれ、上手くいってよかったです。フォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたいdate_queryのbeforeとafterは、デフォルトではその日時と全く同じ投稿日の投稿を除外するのですが、まさか投稿日時が秒まで同じで、なんてことはないですよね。
投稿Bでは正常でしょうか。
またorderのASCとDESCを入れ替えてみるとどうなりますか?フォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたいすみません、また間違えました。
一つ目のコードの1行目を次のように訂正します。function add_category_param( $permalink ) {フックする関数の引数が1個より多いときは
add_filter()に第4引数を与えなければならないのですが、引数は1個しか使っていないので指定しないことにしました。フォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたいthe_permalink()はthe_permalinkというフィルターフックを内部で適用するので、これに関数をフックするだけでいけますね。
functions.php に以下の内容を追加すると、カテゴリアーカイブページのループ内のthe_permalink()でのみ、URLの末尾に?catid=[カテゴリID]のようなGETパラメータを追加します。function add_category_param( $permalink, $post ) { global $wp_query; if ( $wp_query->is_category && $wp_query->in_the_loop ) $permalink .= '?catid='.$wp_query->get_queried_object_id(); return $permalink; } add_filter( 'the_permalink', 'add_category_param' );そして、このGETパラメータを個別投稿ページの「ページ送り」で拾います。
「次の投稿」と「前の投稿」へのリンクURLにも、GETパラメータを受け継ぎます。
以前の回答のコードからいろいろ変更されているので、ご確認ください。
特に、XSS防止のためのesc_url()はお忘れなく。// カテゴリIDの配列 $categories = get_the_category(); $cat_ids = array(); foreach ( $categories as $category ) { $cat_ids[] = (int) $category->term_id; } $get_string = ''; if ( isset($_GET['catid']) && is_numeric($_GET['catid']) ) { // GETパラメータがある場合 $get_string = '?catid='.$_GET['catid']; $cat_id = (int) $_GET['catid']; if ( in_array($cat_id, $cat_ids, true) ) $cat_ids = array($cat_id); } // 現在の投稿の日時 $post_time = $post->post_date; // 前の投稿のクエリ $prev_query = new WP_Query(array( 'posts_per_page' => 1, 'category__in' => $cat_ids, 'date_query' => array( array( 'before' => $post_time, ), ), 'order' => 'DESC', )); // 前の投稿のURL if ( $prev_query->have_posts() ) { $prev_query->the_post(); $prev_post_link = esc_url(get_permalink().$get_string); } // 次の投稿のクエリ $next_query = new WP_Query(array( 'posts_per_page' => 1, 'category__in' => $cat_ids, 'date_query' => array( array( 'after' => $post_time, ), ), 'order' => 'ASC', )); // 次の投稿のURL if ( $next_query->have_posts() ) { $next_query->the_post(); $next_post_link = esc_url(get_permalink().$get_string); } // 投稿データのリセット wp_reset_postdata();GETパラメータの
catidを持ち、その値が数値で、かつ現在の投稿が含まれるカテゴリのIDのいずれかに一致しなければ、無視するようにしています。
無視した場合の挙動は以前の回答と同じです。フォーラム: 使い方全般
返信が含まれるトピック: サイトの各ページの履歴を残す方法はありますか投稿をバックアップする場合は、投稿エディタでHTMLソースをテキストファイルにコピーしておけばいいと思います。
「自動保存」では過去の自動保存の版を上書きしていくため、編集中の状態は1つしか保存されないそうです。
自動保存を無効化することもできます。
参考サイト:http://ishoten.com/web/wordpress/stop-auto-save-and-revision-wordpressフォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたい追伸:
上記の方法では、カテゴリアーカイブのページから個別投稿ページに来た場合にしか、元のカテゴリを判別することはできません。
特に昨今ではサイトの訪問者は検索エンジンから直接、個別投稿ページに訪れるという場合がほとんどだといいますから、この仕組みを実装してもあまり使われないかもしれません。
GETパラメータ付きのURLを検索エンジンにインデックスさせるのはまずいですもんね。フォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたいなるほど、理解できました。
そのような分類を行う場合にはカスタムタクソノミーというのを使うのが一般的だそうですが、カテゴリでもできないことはありません(カテゴリもタクソノミーの一種です)。
例:カスタムタクソノミー「色」……緑色、白、黒、etc.
カスタムタクソノミー「生き物」……カエル、スズメ、猫、etc.
いずれにせよ、リンク元を判別する必要はありますが。確かに、特定のカテゴリに属する投稿を片っ端から読みたいという場合はありますね。
そういう場合、普通はカテゴリアーカイブのページにいちいち戻って次の投稿を探す、というふうに使うものだと思います。
しかし、ページ送りの要領で次の投稿に遷移できれば、楽ではありますね。
投稿が属するカテゴリの分だけページ送りを設置する、という方法だと比較的簡単に実装できそうですが、全くスマートな方法ではありませんね……カテゴリアーカイブのページのテーマファイルで、投稿へのリンクのURLを出力する部分にフィルターフックを設置するなどして、出力するURLをGETパラメータ付きに書き換えれば、個別投稿ページ側でリンク元を判別することができます。
また、個別投稿ページからページ送りによって前後の投稿に遷移する場合も、GETパラメータを維持するようにすればよいでしょう。
それらの実装についてはやはりお使いのテーマ次第(特にカテゴリアーカイブのページのテーマファイル)、ということになります。
よって、ここでコードをお示しすることはできませんが、情報をいただければ時間のあるときにコードを書いてみたいと思います。フォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたい「関係のないカテゴリーへも不規則にリンクされてしまい」とは、投稿1のカテゴリAとは無関係のカテゴリCに属する投稿3にリンクされる、という意味でしょうか。
そうであるなら、WordPressの仕様通りであり、俺のコードの意図する通りですのでなんら問題ありません。
そうでなく全くの無関係の投稿にリンクされるとすれば問題ですが。個別投稿ページの「親ページ」とか「元のページ」というのがカテゴリアーカイブページである、という認識に違和感があります。
ページAからリンクしてもページCからリンクしても、投稿1の内容は同じですし、それを判別する仕組みはWordPressにはありません。
「ページAから来た場合」と「ページCから来た場合」で投稿1の内容を変えるには、URLのGETパラメータ(クエリ文字列)やCookieを使って判別するくらいしか思いつきません。
例えば、ページAにある投稿1へのリンクにはURLに?category=Aを付ける、投稿1ではURLのGETパラメータからリンク元を知り、ページ送りの内容に反映する、とか。
後者はif ( isset($_GET['category']) && $_GET['category'] == 'A' )といった感じでわりと簡単に判別できますが、前者はお使いのテーマ次第ですね。
不可能ではないですが、その場合色々と検討する必要があります。- どのページからのリンクにどのようなGETパラメータを付けるか
- GETパラメータがない場合(カテゴリ以外のページから来た場合)、どのように表示するか
- 思わぬGETパラメータが与えられた場合にどう対処するか
それより、厳密に同一カテゴリ内でのページ送りが必要で、かつひとつの投稿が複数の(それぞれが無関係の?)カテゴリに属する、とはどのような形態なのか、よくわかりません。
投稿が単一のカテゴリのみを持つようサイト構成を見直す、というアプローチもあると思います。フォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたいすみません、コードにいくつかミスがあったので訂正します。
// カテゴリIDの配列 $categories = get_the_category(); $cat_ids = array(); foreach ( $categories as $category ) { $cat_ids[] = $category->term_id; } // 現在の投稿の日時 $post_time = $post->post_date; // 前の投稿のクエリ $prev_query = new WP_Query(array( 'posts_per_page' => 1, 'category__in' => $cat_ids, 'date_query' => array( array( 'before' => $post_time, ), ), 'order' => 'DESC', )); // 前の投稿のURL if ( $prev_query->have_posts() ) { $prev_query->the_post(); $prev_post_link = get_permalink(); } // 次の投稿のクエリ $next_query = new WP_Query(array( 'posts_per_page' => 1, 'category__in' => $cat_ids, 'date_query' => array( array( 'after' => $post_time, ), ), 'order' => 'ASC', )); // 次の投稿のURL if ( $next_query->have_posts() ) { $next_query->the_post(); $next_post_link = get_permalink(); } // 投稿データのリセット wp_reset_postdata();変わったのは以下の2点です。
$post_time = $post->post_date;
「投稿日時」のフォーマットを勘違いしていました。
'date_query' => array( array( 'before' => $post_time, ), ),*_queryのご多分に漏れず、一つ一つをネストした配列に入れるのを失念していました。さて、ループへの組み込み方ですが、あなたのコードは
<a>タグ内の変数をechoしていない点を除いて間違っていません。
間違っていたのはこっちでした。フォーラム: 使い方全般
返信が含まれるトピック: カスタム投稿条件分岐 is_pagedグローバル変数
$pageに現在のページ番号が格納されているはずです(まれにおかしかったりしますが……)。
よってglobal $page; if ( $page > 1 )のように判別できます。- この返信は9年、 2ヶ月前にLABEが編集しました。
フォーラム: 使い方全般
返信が含まれるトピック: 複数カテゴリーを持つ投稿をsingle.phpで一つのカテゴリー毎にページ送りしたい思いついたのは
WP_Queryでcategory__inとdate_queryを指定する方法ですね。
ループ内に以下のPHPを書いてください。// カテゴリIDの配列 $categories = get_the_category(); $cat_ids = array(); foreach ( $categories as $category ) { $cat_ids[] = $category->term_id; } // 現在の投稿の日時 $post_time = get_the_date('U'); // 前の投稿のクエリ $prev_query = new WP_Query(array( 'posts_per_page' => 1, 'category__in' => $cat_ids, 'date_query' => array( 'before' => $post_time, ), 'order' => 'DESC', )); // 前の投稿のURL if ( $prev_query->have_posts() ) { $prev_query->the_post(); $prev_post_link = get_permalink(); } // 次の投稿のクエリ $next_query = new WP_Query(array( 'posts_per_page' => 1, 'category__in' => $cat_ids, 'date_query' => array( 'after' => $post_time, ), 'order' => 'ASC', )); // 次の投稿のURL if ( $next_query->have_posts() ) { $next_query->the_post(); $next_post_link = get_permalink(); } // 投稿データのリセット wp_reset_postdata();「親ページのカテゴリ」というのが、複数のカテゴリの「いずれか」なのか、「すべて」なのかがわからないので、とりあえず「いずれか」のほうでコードを書きましたが、「すべて」にする場合は
category__inをcategory__andに変更してください。フォーラム: 使い方全般
返信が含まれるトピック: 投稿がない月のカレンダーを表示即興でコードを書いてみました。
俺自身はウィジェットを使用していないので、テストはあまりしていません。
値のチェックは多少していますが、グローバル変数が思わぬ値になっているとバグるかもしれません……
リンク先のコードをお使いのテーマの functions.php に追加してください。
http://pastebin.com/SDJDAFLR
「前月」と「翌月」のリンクは、書き換えると未来の月になる場合は書き換えません。
それでも書き換えたい場合、「前月/翌月を書き換え」の部分のif文を外してください。
なお、WordPress 4.7のソースをもとに書いているため、バージョンアップにより動作しなくなる可能性があります。フォーラム: 使い方全般
返信が含まれるトピック: ロールオーバできない件フォーラム: 使い方全般
返信が含まれるトピック: ロールオーバできない件