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

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

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

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

PHP

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

Q&A

解決済

1回答

733閲覧

Wordpressカスタム投稿内のカスタムフィールドの値をショートコードで取得したいです

nuTa

総合スコア4

WordPress

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

PHP

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

0グッド

0クリップ

投稿2022/01/14 07:14

Wordpressのオリジナルテーマ作成に関する質問です。

◆最終的にやりたいこと

カスタム投稿Aの投稿内容を条件により絞り込んで取得し、別ページ(カスタム投稿B)で表示したいです。
表示する際は、ビジュアルエディターにショートコードを記載して取得するようにする想定です。

絞り込み条件
※①と②はAND条件

①カスタム投稿Aのカテゴリーがカスタム投稿Bのカテゴリーと一致
→それぞれのカスタム投稿にカスタムタクソノミーを追加し、スラッグを一致させる
→カスタム投稿Bのカテゴリーを確認して、同じカテゴリーの記事を取得

②カスタム投稿Aのタグ(カスタムタクソノミー)をショートコード記載時に合わせて記載し、一致するスラッグの記事を取得

◆現状でできないこと

ショートコードで取得した記事ループ内のカスタムフィールド(ACFで作成)の値が取得できない

◆現状のコード

以下、function.phpに記載しています。

PHP

1function testget_func($atts){ 2 $atts = shortcode_atts(array( 3 'tag' => '' 4 ),$atts); 5 if ($terms = get_the_terms($post->ID, 'cat_bbb')) { 6 foreach ( $terms as $term ) { 7 $args = array( 8 'post_type' => 'aaa', 9 'posts_per_page' => 3, 10 'tax_query' => array( 11 'relation' => 'AND', 12 array( 13 'taxonomy' => 'cat_bbb', 14 'field' => 'slug', 15 'terms' => $term -> slug 16 ), 17 array( 18 'taxonomy' => 'tag_bbb', 19 'field' => 'slug', 20 'terms' => $atts['tag'], 21 ), 22 ), 23 ); 24 $my_posts = get_posts($args); 25 } 26 } 27 foreach ($my_posts as $post) : setup_postdata($post); 28 $str.='<div class=“design”>’; 29 $str.= '<p>'.the_field('description').'</p>'; 30 $str.='</div>'; 31 endforeach; 32 wp_reset_postdata(); 33 echo $str; 34} 35add_shortcode('testget', 'testget_func');

●「aaa」はカスタム投稿Aの記事タイプ
●「cat_bbb」はカスタム投稿Bの現在の記事のカテゴリー
●「cat_aaa」はカスタム投稿Aの取得したい記事が所属するカテゴリー(カスタムタクソノミー)
●「tag_aaa」はカスタム投稿Aの取得したい記事が所属するタグ(カスタムタクソノミー)
●「description」はカスタム投稿Aの中に記載してあるカスタムフィールドの値
●ショートコード記載時は[testget tag="指定のタグ"]で取得予定

=====

こちらのコードでカテゴリとタグで絞られた記事ループの取得までは確認できています。
<div class=“design”>のデザインが反映されており、表示されている記事の数が指定のカテゴリとタグで絞った記事数と一致するため)

しかし、the_field('description’)で取得しているカスタムフィールドの内容のみが取得できていない状況です。

こちら、原因をいろいろ調べているのですが、究明に至らず、皆様のお知恵をお借りできますと幸いでございます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずは、気になる点を...

foreach ( $terms as $term ) ループの中で、 $my_posts = get_posts($args); と $my_posts に代入していますので、 まず、 $terms のデータ件数だけ繰り返し実行されて、 $my_posts は、最後の検索条件に上書きされていますので、$terms に複数の値があった場合、最後の値の投稿しか取得できないのではないでしょうか。


the_field で取得できない件ですが...

setup_postdata($post); ですが、setup_postdata のドキュメントを見ると グローバル変数でないと正しく動作しない可能性があると記載されています。

質問のコードでは、 $post がグローバル変数ではないようにみえます。
そのため、the_field 関数が、グローバル変数 $post を参照して、グローバル変数 $post->ID の投稿から、カスタムフィールドを取得しようとしているので、表示されていないのではないでしょうか。

参照:

投稿2022/01/14 08:12

CHERRY

総合スコア25171

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

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

nuTa

2022/01/14 11:28

ご回答を頂きましてありがとうございます。 取得しようとしている情報が異なっているコードになってしまっているのですね、、 ちなみに、こちらを修正するとしたら、どこを直せば良いのでしょうか? 独学で必要な知識を都度吸収していっている状況でして、グローバル変数などの理解が曖昧な状況のため、調整箇所などご教示いただけますと幸いでございます。。
nuTa

2022/01/28 00:35

いただいた情報で試行錯誤しまして、なんとか実装できました。 ありがとうございました。
CHERRY

2022/01/28 00:46

コメントいただいていたのですね。 リニューアル後の不具合?で、通知がこなかったため、見落としていました。 testget_func の最初に ` global $post; `を追加すると testget_func 内で、$post を使用するとグローバル変数 $post が使われるので $post に伴う不具合はなくなると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問