Wordpress【ターム毎のリストから、ターム一覧のページを作成したい】

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,440

rym

score 9

この度はお世話になります。
Wordpressの独学を始めて、3ヶ月あまりの初心者中の初心者です。
現在、自己サイトをWordpressで作成中し、毎日奮闘中です。

カスタム投稿を複数(3つ)作成し、カスタム投稿ごとにタクソノミーと複数のタームをそれぞれ作成しました。
サイドバーにタームのリンクリストを表示させています。
(通常のカテゴリーリストのような表示)

発生している問題・エラーメッセージ

それぞれのタームリストから、ターム毎に一覧を表示させたいと考えています。

該当のソースコード

<?php
    $args=array(
        'tax_query' => array(
            array(
                'taxonomy' => 'works_cat', 
                'field' => 'slug', 
                'terms' => array( 'web','graphic' ) 
            ),
        ),
        'post_type' => 'works', 
        'posts_per_page'=> 5 
    );
 ?>

<?php query_posts( $args ); ?>
<?php if(have_posts()): ?>
<?php while(have_posts()):the_post(); ?>

<?php get_template_part('content'); ?> //別のテンプレートを呼び出し

<?php endwhile; else: ?>

ページが存在しない場合の指定

<?php endif; ?>
<?php wp_reset_query(); ?>

試したこと

サイドバーに表示されている、ターム名'web'と'graphic'のリンクリストからは
記述通りの一覧ページが表示されますが、
1つのカスタム投稿(works)を呼び出す記述のみのため、他のタームリストからも同じものが呼び出されてしまいます。

他のタームも同じように、ターム毎の一覧が表示されるよう、ご教示いただけますでしょうか。

説明が解り辛くお手数おかけします。

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/09/13 00:38

    コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。

    キャンセル

  • rym

    2016/09/13 09:00

    ご連絡いただきありがとうごいます。早速修正いたしました。
    初投稿のため、ツールの使用もよくわからず・・・解り辛く申し訳ありませんでした。

    キャンセル

回答 2

checkベストアンサー

+1

「ターム毎に一覧」=「タームのアーカイブページ」を表示するのであれば、自分でqueryを書く必要はないと思います。

get_term_link関数などを使って、タームのアーカイブページへのパーマリンクを取得。テンプレートファイルにループ部分を書くだけでいいのではないでしょうか。

<?php if(have_posts()): ?> 
<?php while(have_posts()):the_post(); ?>

<?php get_template_part('content'); ?> //別のテンプレートを呼び出し

<?php endwhile; else: ?>

ページが存在しない場合の指定

<?php endif; ?> 
<?php wp_reset_query(); ?>

関数リファレンス/get term link - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_term_link

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/12 23:12

    mizさま
    早速、ご教示いただきありがとうございます!
    頂いた回答を元に作成を試み、各タームのリンクリストから、一覧ページを取得することはできましたが、私の説明不足のため再度質問させていただいてもよろしいでしょうか。

    >「タームのアーカイブページ」 を表示

    おっしゃる通りですが、
    カスタム投稿のタクソノミーには複数のタームがあり、
    各リンクのタームをクリックすると、そのタクソノミーに属する全てのタームが表示されます。 

    詳細を申し上げますと、
    1. タクソノミー ’works_cat’ には「web」と「graphic」のタームがあり、

    2. サイドバーに「web」と「graphic」のタームをリンクができるリスト形式で表示。

    3. ターム名「web」をクリックすると、「web」だけの記事のみ取得をさせたいのですが、タクソノミー ’works_cat’に属する「web」と「graphic」の記事の両方が取得されてしまう。
    (※ターム名「graphic」をクリックしても、「web」と「graphic」の両方が取得されます。)

    ■ ターム名「web」のリンクをクリック → 「web」の記事一覧のページへ

    ■ ターム名「graphic」のリンクをクリック → 「graphic」の記事一覧 ページへ

    と、考えております。 


    至らない質問で何度もお手数おかけいたしますが、ご教示いただけますでしょうか。








    キャンセル

  • 2016/09/13 07:32

    >カスタム投稿のタクソノミーには複数のタームがあり、
    >各リンクのタームをクリックすると、そのタクソノミーに属する全てのタームが表示されます。

    通常であれば、各タームの記事だけが表示されるはずなんですが……
    テンプレートファイルやfunctions.phpにquery_posts()やwp_queryの記述が残っていたりはしませんか?

    キャンセル

  • 2016/09/13 10:56

    mizさま

    再度ご教示いただき、ありがとうございます!
    mizさまよりいただいたご回答を参考に解決することができました!!

    >テンプレートファイルやfunctions.phpにquery_posts()やwp_queryの記述が残っていたりはしませんか?

    おっしゃる通り、タームを呼び出したいテンプレートのファイルにquery_posts()を使用しておりました。 
    query_posts()の代わりに → get_postsにて対応したところ、各タームの記事だけが表示されるようになりました。
    (※コードは見やすさを考慮し、下記の「解決方法欄」に記載させていただきます)

    自己解決できずかなりの期間を費やし、ここを解決しなければサイトとしても成り立たないため、本当に助かりました!!ありがとうございます!

    ただ、なぜquery_posts()の代わりに → get_postsに変更すると、各タームの記事だけが表示されるようになるのか、基本的なことが理解に欠けているため、さらに学習を進めたいと考えております。

    phpの基礎知識もないまま、Wordpressに取りかかったため、よく壁にぶつかります。

    現在に至るまで
    1. ネットの動画によりWordpressの概要を学び、
    2. ソシム社より出版の「Wordpressレッスンブック、デザインブック」を片手に、
    3. ネット検索にて何とか自己解決 を試みておりましたが、

    限界を感じ、今回質問させていただきました。
    質問内容を文章に起こすこともとても難しく感じました。

    正直なところプログラミングはとても苦手な分野ですが、理解を深めるために前向きに取り組みたいところです。

    このような状況ですが・・・
    もし、初心者にもお勧めいただける書籍や勉強法などご教示いただけるようでしたら、嬉しいです。


    質問が解決いたしましたこと、本当にありがとうございました。

    キャンセル

0

■ 質問コード ■

$args=array(
        'tax_query' => array(
            array(
                'taxonomy' => 'works_cat', 
                'field' => 'slug', 
                'terms' => array( 'web','graphic' ) 
            ),
        ),
        'post_type' => 'works', 
        'posts_per_page'=> 5 
    );
 ?>

<?php query_posts( $args ); ?> //←ここが問題となるコード
<?php if(have_posts()): ?>
<?php while(have_posts()):the_post(); ?>

<?php get_template_part('content'); ?> //別のテンプレートを呼び出し

<?php endwhile; else: ?>

ページが存在しない場合の指定

<?php endif; ?>
<?php wp_reset_query(); ?>

■ 解決コード ■

$args=array(
        'tax_query' => array(
            array(
                'taxonomy' => 'works_cat', 
                'field' => 'slug', 
                'terms' => array( 'web','graphic' ) 
            ),
        ),
        'post_type' => 'works', 
        'posts_per_page'=> 5 
    );
  $searched_posts = get_posts( $args ); //←query_posts();の代わりにget_posts();を使用
 ?>

<?php if(have_posts()): ?>
<?php while(have_posts()):the_post(); ?>

<?php get_template_part('content'); ?> //別のテンプレートを呼び出し

<?php endwhile; else: ?>

ページが存在しない場合の指定

<?php endif; ?>
<?php wp_reset_query(); ?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/13 13:46

    解決したようでよかったです。ただ少々勘違いなされているところがあるようなので、補足しますね。

    タームのアーカイブを表示するだけであれば、query_postsもget_postsも必要ありません。アーカイブを表示するためのqueryはWordPressのコア部分(内部)で既に実行されているためです。
    したがって、テンプレートファイルには<?php if(have_posts() ): ?>以降さえあれば大丈夫です。
    なので、get_postsのくだりはまるまる消してしまってください。
    それでも、タームのアーカイブページがきちんと表示されることが確かめられると思います。

    get_postsの適切な使い方についてはWordPres Codexなどに目を通してみてください。

    キャンセル

  • 2016/09/13 14:07

    再三に渡りご教示いただき、ありがとうございます。

    >、get_postsのくだりはまるまる消してしまってください。

    確認することができました。 

    今後、基本的な点をより理解を深めるられるよう、取り組みたいと思います。
    大変お手数おかけしました。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる