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

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

ただいまの
回答率

87.34%

特定のカスタムフィールドをタクソノミー別に表示させたいです

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 518

score 8

前提・実現したいこと

お世話になります。
特定のカスタムフィールドにある全てのタクソノミーをタクソノミー別に、タクソノミ名とそれに該当する記事の画像フィールドの画像とタイトルを全て表示させたいです。

商品カテゴリ1(ターム)
 ー画像フィールド + 記事タイトル 1-1
 ー画像フィールド + 記事タイトル 1-2

商品カテゴリ2(ターム)
 ー画像フィールド + 記事タイトル 2-1
 ー画像フィールド + 記事タイトル 2-2
 ー画像フィールド + 記事タイトル 2-3

商品カテゴリ3(ターム)
 ー画像フィールド + 記事タイトル 3-1
 ー画像フィールド + 記事タイトル 3-2
 ー画像フィールド + 記事タイトル 3-3
 ー画像フィールド + 記事タイトル 3-4
 ー画像フィールド + 記事タイトル 3-5

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

下記のコードにてタクソノミ名は全て表示することができたのですが、画像フィールドの画像が表示されず、タイトルが通常投稿のタイトルが表示されてしまいました。

画像を表示してタームの記事タイトルを出したいです。
どうぞご指摘のほどよろしくお願い致します。

投稿タイプスラッグ:menu_post
タクソノミースラッグ:bread
カスタムフィールドの画像フィールド名:menu-photo
画像の返り値:ID

<?php
$terms = get_terms('bread');
foreach( $terms as $term )  :
  echo '<h2><span>' . $term->name . '</span></h2><ul>';
    query_posts('showposts=5&cat=' . $term->term_ID);
        while(have_posts()) :
        the_post();?>
        <li>
            <?php $image = get_field('bread','menu_spot_'.$term_id); if( !empty($image) ): ?>
                <img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt']; ?>" />
            <?php endif; ?>
            <?php the_title(); ?>
        </li>
    <?php 
    endwhile;
  wp_reset_query();
  echo '</ul>';
endforeach;
?>

試したこと

画像の表示で下記も試しましたが表示できませんでした。

<?php
  $image = get_field('menu-photo');
  $size = 'full'; 
  if( $image ) {
    echo wp_get_attachment_image( $image, $size );
  }
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

query_postsはプラグインやテーマで使われることを想定しない関数です

query_posts

一般的な投稿の取得には、WP_Query または get_posts を使ってください。
query_posts の代わりに次のようにすることを強く推奨します:
1. アクション pre_get_posts を用いる。
2. pre_get_posts にフックした関数の中で is_main_query() を使ってメインクエリーであるかチェックする。
3. メインクエリーの場合のみ、それを変更する。

get_field('bread','menu_spot_'.$term_id)
↓
get_field('bread','menu_spot_'.$term->term_id)


なのでは?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/30 21:51

    お世話になります。
    pre_get_postsについて分からなかったので、調べてfunctions.phpに試してみたのですが、うまく動かずエラーが出てしまいました。
    度々申し訳ないのですがご助言頂けませんでしょうか。
    ```
    <?php
    function term_pre_get_posts( $query ) {
    /* 管理画面,メインクエリに干渉しないために必須 */
    if ( is_admin() || ! $query->is_main_query() ){
    return;
    }

    if ( $query->is_post_type_archive('menu_post')) {
    $query->set( 'post_type', 'menu_post' );
    $tax_query[] = array(
    'taxonomy' => 'bread',
    'field' => 'term_id',
    'operator' => 'IN');
    $query->set( 'tax_query', array('relation' => 'AND' , $tax_query) );
    }
    }

    add_action( 'pre_get_posts', 'term_pre_get_posts' );
    ?>
    ```

    ※エラーメッセージ
    ```
    Error: Call to a member function is_main_query() on null in C:\Users\bette\Local Sites\sample\app\public\wp-content\themes\pizza\functions.php on line 98
    Call Stack
    # Time Memory Function Location
    1 0.0005 390728 {main}( ) ...\index.php:0
    2 0.0012 390928 require( 'C:\Users\bette\Local Sites\sample\app\public\wp-blog-header.php' ) ...\index.php:17
    3 0.1960 6737456 require_once( 'C:\Users\bette\Local Sites\sample\app\public\wp-includes\template-loader.php' ) ...\wp-blog-header.php:19
    4 0.2007 6759968 include( 'C:\Users\bette\Local Sites\sample\app\public\wp-content\themes\pizza\page-menu.php' ) ...\template-loader.php:78
    5 0.2090 6795688 apply_filters( ) ...\page-menu.php:5
    6 0.2090 6795984 WP_Hook->apply_filters( ) ...\plugin.php:208
    7 0.2092 6797504 do_shortcode( ) ...\class-wp-hook.php:286
    8 0.2092 6799216 preg_replace_callback ( ) ...\shortcodes.php:199
    9 0.2092 6799696 do_shortcode_tag( ) ...\shortcodes.php:199
    10 0.2092 6800080 my_php_Include( ) ...\shortcodes.php:325
    11 0.2097 6817784 include( 'C:\Users\bette\Local Sites\sample\app\public\wp-content\themes\pizza\menu-archive.php' ) ...\functions.php:22
    12 0.2113 6834224 term_pre_get_posts( ) ...\menu-archive.php:8
    ```

    キャンセル

  • 2019/10/30 22:29

    引用の注意文はサブループでメインクエリを上書きするのをやめましょう
    メインクエリを上書きする必要がある場合でも
    query_postsではなくadd_action('pre_get_posts',...);を使いましょうということです

    質問のケースではget_postsを使うか
    WP_queryオブジェクトを作ってループを書くかで対応すべきです

    https://wpdocs.osdn.jp/関数リファレンス/WP_Query

    質問のコードについては
    今一度変数の中身を細かくvar_dumpするなりして
    想定通りの値が得られているか確認したほうが良いかと思います

    キャンセル

  • 2019/11/01 00:00

    自分がいかにループやメインクエリについて理解してなかったかを身をもって知りました。
    基本的なところから勉強し直してようやく解決できました。

    ご指摘いただいた事で気付くことができました。
    ありがとうございました!

    キャンセル

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

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

同じタグがついた質問を見る