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

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

ただいまの
回答率

89.05%

カスタム投稿ページに作成した、カスタムフィールドの値が全て同じになってしまうので解決方法を教えてください

解決済

回答 1

投稿

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

urushi

score 5

カスタム投稿ページに作成した、カスタムフィールドの値が全て同じになってしまう

現在、WordPressのサイトを作成しており、function.phpでカスタム投稿ページにカスタムフィールドを作成しました。
カスタムフィールドの値が全て最新の投稿の値になってしまうので、困っています。

何か不足している情報があれば教えてください。

例)
1記事目のカスタムフィールドに[チョコレート]と入力し更新。
2記事目のカスタムフィールドに[ドーナツ]と入力し更新すると、1記事目に[チョコレート]と入力した部分が[ドーナツ]に変更されます。

function.phpのソースコード

// カスタムフィールドの追加
add_action( 'admin_menu', 'add_custom_field' );
function add_custom_field() {
    add_meta_box( 'custom-item_sweets', 'お菓子の種類', 'create_item_sweets', 'product', 'normal');
}
// カスタムフィールドのHTMLを追加する時の処理
function create_item_sweets() {
    $keyname = 'item_sweets';
    global $post;
    $get_value = get_post_meta( $post->ID, $keyname, true );
    wp_nonce_field( 'action-' . $keyname, 'nonce-' . $keyname );
    echo '<input name="' . $keyname . '" value="' . $get_value . '">';
}
// カスタムフィールドの保存
add_action( 'save_post', 'save_custom_field' );
function save_custom_field( $post_id ) {
    $custom_fields = ['item_sweets'];
    foreach( $custom_fields as $d ) {
        if ( isset( $_POST['nonce-' . $d] ) && $_POST['nonce-' . $d] ) {
            if( check_admin_referer( 'action-' . $d, 'nonce-' . $d ) ) {

                if( isset( $_POST[$d] ) && $_POST[$d] ) {
                    update_post_meta( $post_id, $d, $_POST[$d] );
                } else {
                    delete_post_meta( $post_id, $d, get_post_meta( $post_id, $d, true ) );
                }
            }
        }
    }
}

taxonomy.phpのソースコード

<?php query_posts($query_string . "&pst_type=product_cat&posts_per_page=10&paged='.$paged"); ?>
<?php if (have_posts()) :  while (have_posts()) : the_post(); ?>

//コンテンツ

<?php endwhile; else: ?>
<p>記事はまだありません。</p>
<?php endif; ?>

試したこと

記事にタイトルを入れて投稿しましたが、タイトルは同じになりませんでした。

カスタムフィールドを作成した際に参考にしたサイト

http://cly7796.net/wp/cms/add-custom-fields-with-functions-php/
ちなみに上記サイトもカスタムフィールドの内容は全て同じになりました、、、

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2019/12/17 12:07

    管理画面でも値の上書きが確認できますか?

    キャンセル

  • urushi

    2019/12/17 12:43

    閲覧ありがとうございます!
    管理画面では上書きされてないです。

    キャンセル

  • CHERRY

    2019/12/17 12:58

    管理画面で上書きされていないのであれば、表示側の問題と思いますが、表示側はどのようなコードでしょうか?

    キャンセル

  • urushi

    2019/12/17 13:37 編集

    コードは下記のように記述しています!

    ```
    <?php
    // カスタムフィールドの値を取得
    $item_sweets = get_post_meta($post->ID, item_sweets, true);
    ?>
    <ul>
    <?php query_posts($query_string . "&pst_type=product_cat&posts_per_page=10&paged='.$paged"); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
      <li><?php echo esc_html( $item_sweets ); ?></li>
    <?php endwhile; else: ?>
      <li>記事はまだありません。</li>
    <?php endif; ?>
    </ul>
    ```

    キャンセル

回答 1

checkベストアンサー

+3

ループの外でカスタムフィールドの値を取得していたら
ループされてる記事のカスタムフィールドの値は取得できないでしょう

メインクエリを書き換えてしまうquery_postsの使用は非推奨です
global $postを書き換えて処理したいとしても
クエリオブジェクトを作って、ループが終わったら
wp_reset_postdataでメインクエリに戻すというようなやり方にしましょう

<ul>
<?php $q=new WP_Query($query_string . "&pst_type=product_cat&posts_per_page=10&paged='.$paged"); ?>
<?php
if ($q->have_posts()) : while ($q->have_posts()) : $q->the_post();
// カスタムフィールドの値を取得
$item_sweets = get_post_meta($post->ID, item_sweets, true);
?>
  <li><?php echo esc_html( $item_sweets ); ?></li>
<?php endwhile;wp_reset_postdata(); else: ?>
  <li>記事はまだありません。</li>
<?php endif; ?>
</ul>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/17 16:04

    教えていただきありがとうございます!

    >ループの外でカスタムフィールドの値を取得していたら
    >ループされてる記事のカスタムフィールドの値は取得できないでしょう
    よくよく考えたらそうですよね!

    無事解決できました!!
    ありがとうございます!

    キャンセル

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

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

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

  • トップ
  • PHPに関する質問
  • カスタム投稿ページに作成した、カスタムフィールドの値が全て同じになってしまうので解決方法を教えてください