サポート » プラグイン » Custom Field Templateグループ化時、バラバラに表示されてしまう

  • 解決済 gin260

    (@gin260)


    はじめまして。
    Custom Field Templateのグループ化+multipleの複製機能を使用し、
    商品リストページのようなものを作りたいと思っています。
    あちこち調べて、何とか形になったものの、一点だけどうしても上手くいかなかったので質問させていただきます。

    【希望する形】
    —————–
    画像01
    ステーキ
    松坂牛を使用したステーキ
    ——————
    画像02
    ビーフシチュー
    じっくり煮込んだビーフシチュー
    ——————-
    のはずが、
    【現状】
    ——————–
    画像01
    ステーキ
    じっくり煮込んだビーフシチュー
    ——————–
    画像02
    ビーフシチュー
    松坂牛を使用したステーキ
    ———————
    と、一部の値が入れ替わってしまうのです。

    長くなりますが、以下テンプレートと表示用ソースです。

    [field0]
    type = fieldset_open
    multipleButton = true
    
    [画像]
    type = file
    mediaLibrary = true
    relation = true
    
    [商品名]
    type = text
    size = 80
    
    [商品説明文]
    type = textarea
    rows = 7
    cols = 70
    
    [field0]
    type = fieldset_close

    ※以下の表示用ソースは、
    http://ja.forums.wordpress.org/topic/6819?replies=2
    を参考にさせていただきました。

    
    $cf  = get_post_custom( $post->ID );
    $value1	= $cf['画像'];
    $value2	= $cf['商品名'];
    $value3	= $cf['商品説明文'];
    $field0 = $cf['field0'];
    $length = $field0[0];
    
    //ソートのための配列生成
    $values = array();
    for( $j = 0; $j < $length; $j ++ ){
    	$v = $value1[$j] . "|" . $value2[$j] . "|" . $value3[$j] ;
    	array_push( $values, $v );
    }
    //$value1でソート
    sort( $values );
    
    //表示
    for( $i = 0; $i < $length; $i ++ ){
    	$value = $values[$i];
    	$v = explode( "|",  $value );
    		echo '<div class="food">';
    		echo wp_get_attachment_image( $v[0] );
    		echo '<h3>' . $v[1] . '</h3>';
    		echo '<p>' . $v[3] . '</p>';
    		echo '</div>';
    }
    

    ちなみに、wordpress2.9.1でCustom Field Template1.8.6です。
    何か解決方法の分かる方、お答えいただければ幸いです。
    よろしくお願い致します。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • gin260さん、はじめまして。
    http://ja.forums.wordpress.org/topic/6819?replies=2
    を投稿した者です。

    せっかく参考にしていただいたのに申し訳ありませんm(_ _)m
    確かに、データの削除・追加をしたり、一度保存した後にデータを入力すると、
    データがバラバラになりますね。

    まだ試せていませんが、本家フォーラムにてうまく行ってるっぽい投稿があり
    ましたので、ご覧になってみて下さい。
    http://wordpress.org/support/topic/plugin-custom-field-template-unique-id-of-each-instance-of-a-multiple-field?replies=12

    私の方でも、試してみたいと思います。

    tonoroさんはじめまして。
    Custom Field Templateのグループ化+multipleは、なかなか資料がなかったので、
    tonoroさんの記事は大変参考になりました。有難うございます。

    そして更に参考記事まで有難うございます!
    早速試してみたいと思います。

    テスト後、こちらに改めてご報告させていただきます。
    それまで申し訳ございませんが未解決のままとさせていただきます。

    参考記事は試していないのですが・・・

    ■カスタムフィールドテンプレート

    [field0]
    type = fieldset_open
    legend = テスト
    multiple = true
    multipleButton = true
    
    [画像]
    type = file
    mediaLibrary = true
    relation = true
    blank = true
    
    [商品名]
    type = text
    size = 80
    blank = true
    
    [商品説明文]
    type = textarea
    rows = 7
    cols = 70
    blank = true
    
    [field0]
    type = fieldset_close

    ■テンプレート

    //DBからデータ取得。
    //$wpdb->postmeta カスタムフィールドのキーと値が保存されているテーブル
    global $wpdb;
    $query = "SELECT meta_id,post_id,meta_key,meta_value FROM $wpdb->postmeta WHERE post_id = $post->ID ORDER BY meta_id ASC";
    $cf = $wpdb->get_results($query, ARRAY_A);
    
    $pics = array();
    $item = array();
    $desc = array();
    
    foreach( $cf as $row ){
    	if( $row['meta_key'] == "画像" ){
    		array_push( $pics, $row['meta_value'] );
    	}
    	if( $row['meta_key'] == "商品名" ){
    		array_push( $item, $row['meta_value'] );
    	}
    	if( $row['meta_key'] == "商品説明文" ){
    		array_push( $desc, $row['meta_value'] );
    	}
    }
    
    $length = count( $pics );
    //表示
    for( $i = 0; $i < $length; $i ++ ){
    		echo '<div class="food">';
    		echo '<h3>' . $item[$i] . '</h3>';
    		echo '<p>' . wp_get_attachment_image( $pics[$i] ) . '<br />';
    		echo $desc[$i] . '</p>';
    		echo '<hr />';
    		echo '</div>';
    }

    CFTには、各項目に「blank = true」というパラメータを追加しました。これ
    に関してはプラグイン作者様にご指南いただきました。

    で「blank = true」をつけると、meta_idの順序と投稿画面での入力順序の整
    合が取れるのですが、get_post_custom()で取得する際meta_idがソートのキー
    になっていないので、元の表示用のソースでは、データがチグハグに表示され
    てしまうようでした。
    なので、DBから直接meta_idでソートした状態で取得しました。
    それ以降のソースはもっときれいに書けそうな気もします。

    上記の設定・ソースで5件ほどのグループの追加・削除を繰り返してみて、問
    題なさそうでした(今回の件もありますので、良くご検証くださいませ)。
    画像を含んだグループを削除すると最後尾のグループの画像を見失う、いう症
    状が出ましたので、この点はまた別の設定が必要なのかも知れません。

    遅くなりましたがtonoroさん有難うございます。
    本家フォーラムの参考記事ですが、いろいろ試してみたものの私のやり方が間違っているのか、思うような表示になりませんでした。
    PHPは本当に見よう見真似なので、ちょっと自信はないのですが…。

    「blank = true」を使った新しい方法とソースまで有難うございます!
    早速検証させていただきましたが仰る通り、グループの追加と削除を繰り返すと
    一番最後のグループの画像が消えてしまうようです。
    さらに、私の方では消えた画像のグループに別のグループの画像が入ってしまうという現象が起こっていました。
    しかし、テキストの方はまったく問題なく表示されております。本当に有難うございます。

    画像の問題だけ何とかしたいので、もう少し未解決のままとさせてください。

    本日付けのアップデートVer.1.8.8で試したところ、こちらの環境では、file,
    textとも期待通りの表示になりましたので、ご報告まで。

    tonoroさん有難うございます。
    おかげさまで、私の方でもテキスト・画像ともに正常に表示されました。
    これでより、カスタムフィールドが使いやすく便利なものになったかと思います。
    半ば諦めかけていたものでしたので、とても嬉しいです。
    本当に有難うございました。

    <?php
    //DBからデータ取得。
    //$wpdb->postmeta カスタムフィールドのキーと値が保存されているテーブル
    global $wpdb;
    $query = “SELECT meta_id,post_id,meta_key,meta_value FROM $wpdb->postmeta WHERE post_id = $post->ID ORDER BY meta_id ASC”;
    $cf = $wpdb->get_results($query, ARRAY_A);

    $pics = array();
    $item = array();

    foreach( $cf as $row ){
    if( $row[‘meta_key’] == “質問” ){
    array_push( $pics, $row[‘meta_value’] );
    }
    if( $row[‘meta_key’] == “回答” ){
    array_push( $item, $row[‘meta_value’] );
    }
    }

    $length = count( $pics );
    for( $i = 0; $i < $length; $i ++ ){
    echo ‘<div>’;
    echo ‘<h3>’ . $pics [$i] . ‘</h3>’;
    echo ‘<hr />’;
               echo ‘<p>’ . $item [$i] . ‘</p>’;
    echo ‘</div>’;
    }
    ?>
    と書いたのですがエラーが表示されます。ご指導お願いします。
    希望としては
    Q:質問内容・・・・
    A:回答・・・・
    で表示できるようにしたいのですが

    Cutom Field Templateの複数項目の出力についてつまづいております。
    上記回答のコード

    ・カスタムフィールドテンプレート

    [field0]
    type = fieldset_open
    legend = テスト
    multiple = true
    multipleButton = true

    [画像]
    type = file
    mediaLibrary = true
    relation = true
    blank = true

    [商品名]
    type = text
    size = 80
    blank = true

    [商品説明文]
    type = textarea
    rows = 7
    cols = 70
    blank = true

    [field0]
    type = fieldset_close

    ・呼び出しているカスタムテンプレートに
    <?php
    //DBからデータ取得。
    //$wpdb->postmeta カスタムフィールドのキーと値が保存されているテーブル
    global $wpdb;
    $query = “SELECT meta_id,post_id,meta_key,meta_value FROM $wpdb->postmeta WHERE post_id = $post->ID ORDER BY meta_id ASC”;
    $cf = $wpdb->get_results($query, ARRAY_A);

    $pics = array();
    $item = array();
    $desc = array();

    foreach( $cf as $row ){
    if( $row[‘meta_key’] == “画像” ){
    array_push( $pics, $row[‘meta_value’] );
    }
    if( $row[‘meta_key’] == “商品名” ){
    array_push( $item, $row[‘meta_value’] );
    }
    if( $row[‘meta_key’] == “商品説明文” ){
    array_push( $desc, $row[‘meta_value’] );
    }
    }

    $length = count( $pics );
    //表示
    for( $i = 0; $i < $length; $i ++ ){
    echo ‘<div class=”food”>’;
    echo ‘<h3>’ . $item[$i] . ‘</h3>’;
    echo ‘<p>’ . wp_get_attachment_image( $pics[$i] ) . ‘
    ‘;
    echo $desc[$i] . ‘</p>’;
    echo ‘<hr />’;
    echo ‘</div>’;
    } ?>

    としてみましたが、うまくいきませんでした。

    この場合、wordpressのカスタムテンプレートではなく、カスタムフィールドテンプレートのPHP CODEに上記コードを書くのでしょうか?

    カステムフィールドテンプレートの複数項目についての情報が少なく困っております。
    ご指南ください。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「Custom Field Templateグループ化時、バラバラに表示されてしまう」には新たに返信することはできません。