サポート » 使い方全般 » 複数カテゴリーを選択した記事の表示について

  • 解決済 qawp

    (@qawp)


    皆様
    お世話になります。

    WordPressの条件分岐について質問です。
    カテゴリー毎に表示される記事のデザインを変更したいのですが、
    複数のカテゴリーに登録した際に思い通りに表示できません。

    「cate01(ID:1)」と「cate02(ID:2)」の2つのカテゴリーがあり、
    表示する記事ページ(single.php)のデザインを分けています。
    「cate01(ID:1)」は「single01」、「cate02(ID:2)」は「single02」という具合です。

    そこで、「cate01(ID:1)」と「cate02(ID:2)」の両方に該当する記事の場合、
    「cate02(ID:2)」からリンクされた記事を表示すると「cate01(ID:1)」のテンプレートが割り当てられてしまいます。

    現状「single.php」で以下のように条件分岐させているのですが、
    先に「cate01(ID:1)」の記述があるので、優先されるのではないかと思います。

    <?php
    if ( in_category(‘1’) ) {
    include(TEMPLATEPATH . ‘/single01.php’);
    } else if ( in_category(‘2’) ) {
    include(TEMPLATEPATH . ‘/single02.php’);
    } else {
    include(TEMPLATEPATH . ‘/index.php’);
    }
    ?>

    「cate02(ID:2)」から「single02」を表示するにはどうすればよいでしょうか?

    また、header.php内もカテゴリー別で表示したいのですが、
    こちらも「cate02」からリンクされた記事(single.php)を見ても、
    「cate01」が表示されてしまいます。

    こちらは以下の通り記述しています。

    <?php if (in_category(‘1’)): ?>
    「cate01」の内容を表示

    <?php if (in_category(‘2’)): ?>
    「cate02」の内容を表示

    <?php else: ?>
    それ以外を表示

    当方PHP初心者ですので、あまり詳しいことはわかりません。
    どうぞよろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全17件中)
  • ishitaka

    (@ishitaka)

    こんにちは

    そのままでは遷移元ページを取得することができないので、どのカテゴリーアーカイブインデックスページから遷移したのか判定することができません。
    リファラー($_SERVER[‘HTTP_REFERER’])で遷移元ページが設定されている場合もありますが、設定されていることは稀なので・・・。
    遷移元で URL パラメーターを設定する等の何かしらの工夫が必要です。

    URL パラメーターを使う場合

    遷移元のカテゴリーアーカイブインデックスページ(archive.php 等)で、リンクの URL にカテゴリー ID のパラメーター(下記コードでは ‘catid’ としました)を付加します。

    例)
    esc_url( get_permalink() )

    esc_url( empty( $cat ) ? get_permalink() : add_query_arg( 'catid', $cat, get_permalink() ) )

    single.php ではそのパラメーターで判定します。

    if ( isset( $_GET['catid'] ) ) {
    	$catid = intval( $_GET['catid'] );
    	if ( $catid === 1 ) {
    		(省略)
    	} else if ( $catid === 2 ) {
    		(省略)
    	}
    } else {
    (省略)

    ページ送りからの遷移でも有効にする場合は、下記トピックを参照してみてください。
    https://ja.wordpress.org/support/topic/投稿ページの前後移動 カテゴリで変更する/

    ishitakaさんありがとうございます。
    またお返事、お礼が遅くなり申し訳ないです。

    わからないことばかりで、
    自分で調べてからと思ったのですが、まだわからないままです。

    (archive.php)

    “><?php the_title(); ?>

    の記述を

    “><?php the_title(); ?>

    (single.php )
    <?php
    if ( isset( $_GET[‘catid’] ) ) {
    $catid = intval( $_GET[‘catid’] );
    if ( $catid === 1 ) {
    include(TEMPLATEPATH . ‘/single01.php’);
    } else if ( $catid === 2 ) {
    include(TEMPLATEPATH . ‘/single02.php’);
    } else {
    include(TEMPLATEPATH . ‘/index.php’);
    }
    ?>

    ということでしょうか?
    記述してみたのですが、うまく表示されないようです。

    申し訳ないのですが、もう少しご教授いただけないでしょうか?
    よろしくお願いいたします。

    すいません。
    (archive.php)の記述がうまく表示されていませんでした。

    <?php the_permalink(); ?>

    <?php esc_url( empty( $cat ) ? get_permalink() : add_query_arg( ‘catid’, $cat, get_permalink() ) ) ?>

    です。
    よろしくお願いいたします。

    get_permalink はパーマリンクを取得するだけで出力はしません。
    the_permalink の代わりに使用する場合は出力(echo)する必要があります。

    <?php echo esc_url( empty( $cat ) ? get_permalink() : add_query_arg( 'catid', $cat, get_permalink() ) ); ?>

    なお、このフォーラムでコードを貼り付ける場合は、コードを逆クォートで囲んで(コードを選択し [code] ボタンをクリック)ください。
    詳細は下記ページを参照してください。
    https://wpdocs.osdn.jp/フォーラムへようこそ#.E3.82.B3.E3.83.BC.E3.83.89.E3.81.AE.E6.8A.95.E7.A8.BF

    あと、コードに全角スペースが含まれています。半角スペースに変更してください。

    <?php esc_url( empty( $cat ) ? get_permalink() : add_query_arg( ‘catid’, $cat, get_permalink() ) ) ←ここ?>

    ishitakaさんありがとうございます。

    教えていただいた内容でリンク先が以下のように表示されるのでこちらは機能しているように思うのですが、

    http://xxx.com/cate01/18?catid=1

    リンク先が真っ白で表示されています。

    single.phpへの記述は教えていただいた通りかと思うのですが、

    <?php
    if ( isset( $_GET['catid'] ) ) {
    $catid = intval( $_GET['catid'] );
    if ( $catid === 1 ) {
    include(TEMPLATEPATH . '/single01.php');
    } else if ( $catid === 2 ) {
    include(TEMPLATEPATH . '/single02.php');
    } else {
    include(TEMPLATEPATH . '/index.php');
    }
    ?>

    dreamwerverでは最後の

    ?>

    にアラートが出ていますが、私では理解出来まていません。
    申し訳ありませんが、ご教授いただけますでしょうか?

    よろしくお願いいたします。

    見やすいようにコードを整形(インデント等)してみました。

    <?php
    if ( isset( $_GET['catid'] ) ) {
    	$catid = intval( $_GET['catid'] );
    	if ( $catid === 1 ) {
    		include( TEMPLATEPATH . '/single01.php' );
    	} else if ( $catid === 2 ) {
    		include( TEMPLATEPATH . '/single02.php' );
    	} else {
    		include( TEMPLATEPATH . '/index.php' );
    	}
    ?>

    最初の if ステートメントの開き波括弧({)に対する、閉じ波括弧(})がないからではないでしょうか。

    • この返信は1 週、 5 日前に  ishitaka さんが編集しました。

    何度もありがとうございます!

    > 最初の if ステートメントの開き波括弧({)に対する、閉じ波括弧(})がないからではないでしょうか。

    if ( $catid === 1 ) {
    の前に閉じ括弧をつければ表示されました!

    本当にありがとうございます。

    厚かましいお願いで申し訳ないのですが、
    もう2点教えていただけるとありがたいです。

    サイトの構成は以下の通りですが、

    top

    ┣ 固定ページA
    ┃  ┗カテゴリー1
    ┃ ┗記事1

    ┣ 固定ページB
    ┃  ┗カテゴリー2
    ┃ ┗記事1

    固定A、Bにも以下のソースで3件表示するようにしています。

    <?php $args = array(
         'category_name' => 'cate01',
         'posts_per_page' => 3, 
    ); ?>
    <?php $loop = new WP_Query( $args ); ?>
    <?php if($loop -> have_posts()): ?>
    <?php while($loop -> have_posts()): $loop->the_post(); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>

    今のままでは、single.phpで振り分けたテンプレートへ振り分けられないようです。
    どう記述すればよいでしょうか?

    あと、single.php同様にヘッダー、フッターなども切り替えたい場合、
    header.php内で条件分岐させるのではなく、
    single01.php内の

    <?php get_header(); ?>

    ではなくテンプレートを別で作成し、読み込ませた方がよいでしょうか?

    現在は以下のようにheader.php内に記述しております。

    <?php if (is_tree('固定ページAのID') || is_category('1') || in_category('1')): ?>
    固定ページA以下のヘッダー内容
    <?php elseif (is_tree('固定ページBのID') || is_category('2') || in_category('2')): ?>
    固定ページB以下のヘッダー内容
    <?php else: ?>
    その他のヘッダー内容
    <?php endif; ?>

    何度も申し訳ありませんが、よろしくお願いいたします。

    固定A、Bにも以下のソースで3件表示するようにしています。

    archive.php と同様に URL パラメーターを追加します。
    ただし、グローバル変数 $cat の代わりにカテゴリー ID(下記コードでは 123)を記述してください。

    <?php the_permalink(); ?>

    <?php echo add_query_arg( 'catid', 123, get_permalink() ); ?>

    テンプレートを別で作成し、読み込ませた方がよいでしょうか?

    うーん、これは何とも言えません。好みでいいのでは。

    header.php の場合

    これも、single.php と同様です。
    念のため is_single 関数で個別投稿ページ(シングルページ)の条件を追加しておくといいと思います。

    if ( is_single() && isset( $_GET['catid'] ) ) {
    	$catid = intval( $_GET['catid'] );
    	if ( $catid === 1 ) {
    		(省略)
    	}
    }
    • この返信は1 週、 5 日前に  ishitaka さんが編集しました。理由: 誤記

    ありがとうございます!

    無事に表示されました!

    何度も申し訳ないのですが、
    最後にもう1点ご教授いただきたいのですが、

    header.php内の記述ですが、
    特定の固定ページ、特定のカテゴリーページ、そのカテゴリーに属する記事ページに、
    教えていただいた内容を反映するにはどうすればよいでしょうか?
    現状は以下のように記述しています。

    <?php if (is_tree('固定ページとそれに属する固定ページ') || is_category(array('1','3')) || in_category(array('1','3'))): ?>

    何度も本当に申し訳ないのですが、
    どうぞよろしくお願いいたします。

    ちょっとどのようにしたいのか把握できていないのですが・・・こういうことかな?

    <?php
    if ( is_single() ) {
    	// 投稿ページ
    	if ( isset( $_GET['catid'] ) ) {
    		// カテゴリー ID の指定あり
    		$catid = intval( $_GET['catid'] );
    		if ( $catid === 1 ) {
    			// カテゴリー1
    		} else if ( $catid === 2 ) {
    			// カテゴリー2
    		} else {
    			// その他のカテゴリー
    		}
    	} else {
    		// カテゴリー ID の指定なし
    		if ( is_category( 1 ) ) {
    			// カテゴリー1
    		} else if ( is_category( 2 ) ) {
    			// カテゴリー2
    		} else {
    			// その他のカテゴリー
    		}
    	}
    } else if ( is_page() ) {
    	// 固定ページ
    	if ( is_tree() ) {
    		// is_tree って何?
    	} else {
    		// is_tree って何?
    	}
    }
    ?>
    • この返信は1 週、 4 日前に  ishitaka さんが編集しました。理由: 誤記

    ありがとうございます!

    説明がうまくなく申し訳ないです。
    2点教えていただきたいのですが、

    投稿ページの

    $catid === 1

    ですが、「カテゴリー1」または「カテゴリー3」の場合、という風に

    (array('1','3')

    のように複数記述することはできるのでしょうか?
    (すいません。ここで今まで出てこなかったカテゴリー3を記述しています。)

    あと、「// カテゴリー1」の箇所は、条件に合う場合に表示する内容になるのかと思いますが、
    どう記述すればよいでしょうか?

    if ( isset( $_GET['catid'] ) ) {
    		// カテゴリー ID の指定あり
    		$catid = intval( $_GET['catid'] );
    		if ( $catid === 1 ) {
    			<h1>カテゴリー1の場合に表示する内容</h1>
    		} else if ( $catid === 2 ) {

    上記のように通常のhtmlの記述かechoでの表示かと思ったのですが、
    どちらも違うようでしたので教えていただけるとありがたいです。

    色々と根本的なことがわかっておらず申し訳ありませんが、
    どうぞよろしくお願いいたします。

    「カテゴリー1」または「カテゴリー3」の場合

    「または」は or(||)なので、

    「カテゴリー1」||「カテゴリー3」

    if ( $catid === 1 || $catid === 3 )

    「// カテゴリー1」の箇所は、条件に合う場合に表示する内容になるのかと思いますが、どう記述すればよいでしょうか?

    if ( $catid === 1 ) {
    	echo '<h1>カテゴリー1の場合に表示する内容</h1>';
    } else if ( $catid === 2 ) {

    if ( $catid === 1 ) { ?>
    	<h1>カテゴリー1の場合に表示する内容</h1>
    <?php } else if ( $catid === 2 ) {

    等でしょうか。

    ありがとうございます!

    投稿ページと固定ページは表示されたのですが、
    カテゴリーページのみうまくいきません。

    表示させたいパターンは3パターンです。

    ・カテゴリーID:1、3の内容を表示
    ・カテゴリーID:2、4の内容を表示
    ・その他の内容を表示

    <?php
    if ( is_single() ) {
    	// 投稿ページ
    	if ( isset( $_GET['catid'] ) ) {
    		// カテゴリー ID の指定あり
    		$catid = intval( $_GET['catid'] );
    		if ( $catid === 1 || $catid === 3 ) {
    			echo '<h1>カテゴリーID:1、3の内容を表示</h1>';
    		} else if ( $catid === 2 || $catid === 4 ) {
    			echo '<h1>カテゴリーID:2、4の内容を表示</h1>';
    		} else {
    			echo '<h1>その他の内容を表示</h1>';
    		}
    	} else {
    		// カテゴリー ID の指定なし
    		if ( is_category( array( 1 , 3 ))) {
    			echo '<h1>カテゴリーID:1、3の内容を表示</h1>';
    		} else if ( is_category( array( 2 , 4 ))) {
    			echo '<h1>カテゴリーID:2、4の内容を表示</h1>';
    		} else {
    			echo '<h1>その他の内容を表示</h1>';
    		}
    	}
    } else if ( is_page() ) {
    	// 固定ページ
    	if ( is_tree('1') ) {
    		echo '<h1>カテゴリーID:1、3の内容を表示</h1>';
    	} else if ( is_tree('2') ) {
    		echo '<h1>カテゴリーID:2、4の内容を表示</h1>';
    	} else {
    		echo '<h1>外壁塗装ヘッダー</h1>';
    	}
    }
    ?>

    何度も申し訳ありませんが、よろしくお願いいたします。

    is_category 関数でカテゴリー アーカイブ ページかどうか判定できます。

    <?php
    if ( is_single() ) {
    	// 投稿ページ
    } else if ( is_page() ) {
    	// 固定ページ
    } else if ( is_category() ) {
    	// カテゴリー アーカイブ ページ
    }
    ?>

    各ページの条件分岐は下記ページを参照してください。
    http://wpdocs.osdn.jp/関数リファレンス/is_category

15件の返信を表示中 - 1 - 15件目 (全17件中)
  • このトピックに返信するにはログインが必要です。