質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

3405閲覧

カスタム投稿タイプで「いま表示中のページのカテゴリID」を取得するためには?

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/10/13 18:47

###■目的
WP-PostViewsというプラグインを使って、「現在表示中の記事のカテゴリ内の、人気記事」を表示したいです。(ただしカスタム投稿タイプになります。)

###■現状
下記のように書いているのですが、h3タグの部分しか表示されません。

single-example.php

php

1<!-- 関連記事ランキング表示 --> 2<div class="wp-postviews"> 3 <h3>関連記事</h3> 4 <ol> 5 <?php 6 //現在のカテゴリIDを配列で取得 7$now_id = get_queried_object_id($post->ID,'fields=ids');?> 8 </ol> 9<?php 10global $post; 11$args = array( 12 'post_type' => $now_id, 13 'posts_per_page' => 5, 14 'terms_in' => $now_id, 15 'meta_key' => 'views', 16 'orderby' => 'meta_value_num' 17); 18$posts = get_posts( $args ); 19foreach( $posts as $post ) { 20 setup_postdata($post); 21 ?> 22 <li><?php the_post_thumbnail( array(100, 100), array('alt'=>get_the_title()) ); ?><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> 23 <?php 24 } 25wp_reset_postdata(); 26?> 27</div>

###■質問
①カテゴリIDを取得する部分↓が間違っているのかなって思います。
get_queried_object_id($post->ID,'fields=ids');
現状はこう書いておりますけれど、違うようです。
どうすれば、カスタム投稿タイプで「いま表示中のページのカテゴリID」を取得できるのでしょうか?

②それとも別のところでしょうか?

以上です。①か②か、お分かりになる方、よろしくお願いいたします。m(__)m

###■ちなみに
これはあっていると思いますが念のため。
functions.phpではこのように書いてカスタム投稿タイプにカテゴリを設定しています。

php

1// カスタム投稿タイプの追加 2add_action( 'init', 'custum_post_type' ); 3function custum_post_type() { 4 //test1の投稿タイプ追加 5 register_post_type( 'test1', 6 array('labels' => 7 array( 8 'name' => __( 'test1' ), 9 'singular_name' => __( 'test1' ) 10 ), 11 //投稿タイプの設定 12 'public' => true, 13 'menu_position' => 5, 14 'hierarchicla' => false, 15 'has_archive' => true, 16 //パーマリンクを /test1/投稿名/ にします。 17 'rewrite' => array( 18 'slug' => 'wp-test1' 19 ), 20 //投稿編集ページの設定 21 'supports' => array('title','editor','thumbnail', //タイトル,編集,アイキャッチ 22 'custom-fields','excerpt','author','trackbacks', //カスタムフィールド,抜粋文&作成者,トラックバック 23 'comments','revisions','page-attributes') //コメント,リビジョン,作成者,表示順のボックス 24 ) 25 ); 26 //test1のカテゴリー追加 27register_taxonomy( 28 'test1-category', /* タクソノミーのslug */ 29 'test1', /* 属する投稿タイプ */ 30 array( 31 'hierarchical' => true, 32 'update_count_callback' => '_update_post_term_count', 33 'label' => 'カテゴリー', 34 'singular_label' => 'カテゴリー', 35 'public' => true, 36 'show_ui' => true 37 ) 38); 39}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

試行錯誤された結果だとは思うのですが、タグの順序がおかしかったり、
関数名が誤っていたり、少し散らかってしまっているようです。

まず、functions.phpの内容をもとに状況を整理します。

  • test1というカスタム投稿タイプがある
  • test1に所属する、test1-categoryというカスタムタクソノミーがある
  • 今表示している記事と同じタームがついた記事を、カスタムフィールドViewsの順番で5件表示したい

単語の意味については、以下のサイトさんなどを参考にされてください。
KANTENA.com | 投稿タイプ、タクソノミー、タームについて

通常のカテゴリーとカスタム投稿タイプと紐づく
カスタムタクソノミー(として宣言したカテゴリー)では記述も大きく変わります。

質問文に記載頂いていた内容だと、カスタムタクソノミーに対応できていなかったので、
カスタムタクソノミーの内容を取得~記事を検索する流れを紹介します。

1.表示中の記事が所属しているタームを取得する

シングルページでget_queried_object_idを取得すると、
タームIDではなく、記事IDが返ってきてしまいます。

タームIDは、所属する全てのタームを取得できるthe_termsを使って取得すると良いです。

php

1<?php 2//配列$term_idsに、表示中の記事が所属している、カスタムタクソノミー「test1-category」のタームIDを格納します 3$terms = the_terms(get_the_ID(),'test1-category'); 4$term_ids = array(); 5foreach($terms as $term){ 6 $term_ids[] = $term->term_id; 7} 8?> 9

2.同じタームに所属している記事を検索する

タームIDを指定してget_postsで取得するには以下の様にします。

php

1<?php 2//タームIDが含まれている記事を取得して$postsに格納します 3$args = array( 4 'post_type' => 'test1', //ここにはカスタム投稿タイプ名を入れます 5 'posts_per_page' => 5, 6 'meta_key' => 'views', 7 'orderby' => 'meta_value_num', 8 'tax_query' => array( //タームを検索する場合の表記はここから…… 9 array( 10 'taxonomy' => 'test1-category', //ここにはカスタムタクソノミー名を入れます 11 'field' => 'term_id', //今回はタームIDで検索するのでterm_idを入れます 12 'terms' => $term_ids, //IDが格納された配列を指定します 13 'operator' => 'IN' //格納されているいずれかに一致した記事を見つける場合の表記です(全てに一致とする場合はANDにします) 14 ), 15 ), //……ここまで 16); 17$posts = get_posts($args); 18?>

サンプル

viewsなどのカスタムフィールドを準備するのが手間だったので
動作の確認は行っていませんが、この様な感じで上手く動くのではと思います。

php

1<?php 2$terms = the_terms(get_the_ID(),'test1-category'); 3$term_ids = array(); 4foreach($terms as $term){ 5 $term_ids[] = $term->term_id; 6} 7$args = array( 8 'post_type' => 'test1', 9 'posts_per_page' => 5, 10 'meta_key' => 'views', 11 'orderby' => 'meta_value_num', 12 'tax_query' => array( 13 array( 14 'taxonomy' => 'test1-category', 15 'field' => 'term_id', 16 'terms' => $term_ids, 17 'operator' => 'IN' 18 ), 19 ), 20); 21$posts = get_posts($args); ?> 22 23<div class="wp-postviews"> 24 <h3>関連記事</h3> 25 <ol> 26 <?php foreach($posts as $post): setup_postdata($post); ?> 27 <li>...表示の内容...</li> 28 <?php wp_reset_postdata(); endforeach; ?> 29 </ol> 30</div>

もし、質問の解釈が間違えている部分などあればご指摘ください。

カスタム投稿タイプやカスタムタクソノミーにタームなど、
名前も似ていて紛らわしいですが、使いこなすとすっごく便利なものです。
難しいのは初めだけなので、頑張ってみてください!

投稿2016/10/14 03:55

gzrita

総合スコア236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/14 04:00

すごい…。パッと見で「わかりやすい&優しいご回答だ」って、分かりますわ。ここの人ってみんな頭良いですね!今ちょっと取り込んでいるので、後で確認させてくださいませ。取り急ぎお礼まで☆ありがとうございますm(__)m
退会済みユーザー

退会済みユーザー

2016/10/14 14:27

こんばんは。飲みすぎながらもさっそく試してみました(^^)/ むむ~、 むむぅ、 「この行↓がInvalid argument suppliedだよ」ってエラーが表示されてしまいました… foreach ( $terms as $term ) { いや、そんなアホな、という感じですよね。 ここが違うっていったい… しかし、こんなもの自分でゼロから書けるようになるんですかほんとに。。汗
退会済みユーザー

退会済みユーザー

2016/10/14 14:35

ちなみに上の方のこの部分は <?php $terms = the_terms(get_the_ID(),'test1-category'); こうとか <?php $terms = get_terms(get_the_ID(),'test1-category'); こうでは <?php $terms = get_the_terms(get_the_ID(),'test1-category'); ないですよね? まぁ、前者は上述したエラーで、後者はh3しか表示されませんでしたから違うのでしょうけれど。笑
退会済みユーザー

退会済みユーザー

2016/10/14 14:41

いえ、失礼いたしました。やっぱり the_terms なのですね。 いやぁぜんぜんわからん。。笑 「もしかしてここじゃない?」など軽くヒントを頂戴できませんでしょうか?
yukikp

2018/01/24 05:12

$terms = get_terms(get_the_ID(),'test1-category'); が正解だと思います。 それでもエラーが出るとのことですので、 'meta_key' => 'views', 'orderby' => 'meta_value_num', を削除して、よりシンプルな状態で表示されるかを確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問