• 解決済 naga0825

    (@naga0825)


    プラグイン「Custom field template」でチェックボックスを使って複数の画像を表示させているのですが、選択した数によって画像の表示順番がおかしくなり、困っています。

    カスタムフィールドテンプレートは
    ========================================
    [icon]
    type = checkbox
    value = A#B#C#D#E
    label = 画像を選択してください。(複数選択可)
    ========================================

    と設定していて、
    表示するページには、

    ========================================
    <?php
    $sicon = (array)post_custom(‘icon’);
    foreach ($sicon as $sicon) {
    switch($sicon) {
    case ‘A’;
    echo “<img src=’画像のURL’ />”;
    break;
    case ‘B’;
    echo “<img src=’画像のURL’ />”;
    break;
    case ‘C’;
    echo “<img src=’画像のURL’ />”;
    break;
    case ‘D’;
    echo “<img src=’画像のURL’ />”;
    break;
    case ‘E’;
    echo “<img src=’画像のURL’ />”;
    break;
    }
    }
    ?>
    ========================================
    と書いています。
    この状態でABCEにチェックをすると
    「E」「C」「B」「A」と表示されたり、
    ABCにチェックをすると
    「A」「B」「C」のはずが
    「C」「B」「A」と表示されたりしてしまいます。

    何が原因かわからず困っております。
    どなたかご教示いただけないでしょうか。
    よろしくお願いします。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • こんにちは。
    foreach の前で var_dump($sicon); としてみると、どのように表示されますか?

    トピック投稿者 naga0825

    (@naga0825)

    getspaceさん、ご返信ありがとうございます。
    早速試してみたところ。。。

    =====================================
    ◎「C」「B」「A」の場合
    array(5){
    [0]=> atring(0)””
    [1]=> string(0)””
    [2]=> string(4)”C”
    [3]=> string(4)”B”
    [4]=> string(6)”A”
    }

    ◎「A」「B」「C」の場合
    array(5){
    [0]=> string(6)”A”
    [1]=> string(4)”B”
    [2]=> string(4)”C”
    [3]=> string(0)””
    [4]=> string(0)””
    }

    ◎「E」「C」「B」「A」の場合
    array(5){
    [0]=> string(0)””
    [1]=> string(5)”E”
    [2]=> string(4)”C”
    [3]=> string(4)”B”
    [4]=> string(6)”A”
    }
    =====================================
    という値が表示されました。

    見ると、毎回バラバラに設定されているようですが、
    これは設定がされていないということでしょうか?

    これは設定がされていないということでしょうか?

    という事ではなく、「意図した通り(アルファベット順)に保存されていない」が正しいかと思います。

    厳密な挙動は見ていませんが、クリックした順番とかで配列に格納し、データベースに保存しているのではないでしょうか。(カテゴリーとかがそう)

    foreachは0番目から順番に処理しますので、
    保存されている順番通りなら正しい挙動です。

    じゃ、どうするかというと、カスタムフィールドの値を取り出したあとに
    アルファベット順になるようにsort関数で配列を組み直してから、
    foreachでループすればいいと思います。
    ※未検証ですが

    <?php
    $icons = get_post_meta($post->ID, 'icon', false); // get_post_metaを使うと配列で返せる
    sort($icons);
    foreach ($icons as $icon) {
      switch($icon) {
        case 'A';
          echo "<img src='画像のURL' />";
          break;
        case 'B';
          echo "<img src='画像のURL' />";
          break;
        case 'C';
          echo "<img src='画像のURL' />";
          break;
        case 'D';
          echo "<img src='画像のURL' />";
          break;
        case 'E';
          echo "<img src='画像のURL' />";
          break;
      }
    }
    ?>

    トピック投稿者 naga0825

    (@naga0825)

    getspaceさん、ご教示ありがとうございます。

    早速試してみたところ、
    ====================================
    「C」「B」「A」の場合

    「B」「C」「A」

    「A」「B」「C」の場合

    「B」「C」「A」

    「E」「C」「B」「A」の場合

    「E」「B」「C」「A」
    ====================================
    となりました。
    チェックを「A」から押しても同じ結果でした。
    相変わらず、表示順が逆からなのが気になります。

    お手数おかけしますが、ご教示をいただけないでしょうか。
    よろしくお願いします。

    このコードを実施するとどうなりますか?

    <?php
    $icons = get_post_meta($post->ID, 'icon', false); // get_post_metaを使うと配列で返せる
    echo "<div>保存されている配列</div><pre>"
    var_dump($icons); // 保存されたままの状態の配列を表示
    echo "</pre>"
    
    $sort_icons = sort($icons); // 配列をソートし直す
    echo "<div>ソートし直した配列</div><pre>"
    var_dump($sort_icons);
    echo "</pre>"
    ?>

    先の投稿にも書きましたが、foreachは0番目から順番に処理します。
    カスタムフィールドに保存されている順番が(理由はどうあれ)表示したい順番でなければ、
    一度取得した配列を、表示したい順番に並べ直すという処理が必要です。

    トピック投稿者 naga0825

    (@naga0825)

    getspaceさん、ご教示ありがとうございます。
    配列の表示を試してみました。

    ◎表示順を「A」「B」「C」としたい場合
    ===================================
    保存されている配列
    array(3) {
    [0]=>
    string(4) “C”
    [1]=>
    string(4) “B”
    [2]=>
    string(6) “A”
    }
    または
    array(3) {
    [0]=>
    string(6) “A”
    [1]=>
    string(4) “B”
    [2]=>
    string(4) “C”
    }

    ソートし直した配列
    bool(true)
    array(3) {
    [0]=> string(4) “B”
    [1]=> string(4) “C”
    [2]=> string(6) “A”
    }
    ===================================

    ◎表示順を「A」「B」「C」「E」としたい場合
    ===================================
    保存されている配列
    array(4) {
    [0]=>
    string(6) “A”
    [1]=>
    string(4) “B”
    [2]=>
    string(4) “C”
    [3]=>
    string(5) “E”
    }
    または、
    array(4) {
    [0]=>
    string(5) “E”
    [1]=>
    string(4) “C”
    [2]=>
    string(4) “B”
    [3]=>
    string(6) “A”
    }

    ソートし直した配列
    bool(true)
    array(4) {
    [0]=> string(5) “E”
    [1]=> string(4) “B”
    [2]=> string(4) “C”
    [3]=> string(6) “A”
    }
    ===================================
    ソートし直した配列は全て順番が逆になってしまっているようですが、
    (しかもBとCが必ず逆)
    保存した配列が順番どおりだったり逆順だったりするのが気になります。
    カスタムフィールドテンプレートには
    「A」「B」「C」「D」「E」の順番で
    チェックボックスを設定しています。

    何か順番を不安定にさせる要素があるのでしょうか。

    こちらもで確認しました。
    カスタムフィールドテンプレートの設定

    [icon]
    type = checkbox
    value = A#B#C#D#E
    label = 画像を選択してください。(複数選択可)

    出力時のコード

    <?php
    $icons = get_post_meta($post->ID, 'icon', false); // get_post_metaを使うと配列で返せる
    echo "<div>保存されている配列</div><pre>";
    var_dump($icons); // 保存されたままの状態の配列を表示
    echo "</pre>";
    
    sort($icons); // 配列をソートし直す
    echo "<div>ソートし直した配列</div><pre>";
    var_dump($icons);
    echo "</pre>";
    ?>

    ソートし直した配列

    array(3) {
      [0]=>
      string(1) "A"
      [1]=>
      string(1) "C"
      [2]=>
      string(1) "D"
    }

    カスタムフィールドのvalueがすべて半角英数字なら期待通りの動作になるはずです。
    (string(1)となる)

    naga0825さんの場合、
    [0]=> string(5) “E”
    となっているので、何か余計な値が保存されていませんか?
    もう一度設定を見直してみてはどうでしょ?

    トピック投稿者 naga0825

    (@naga0825)

    gatespaceさん、
    わざわざ検証ありがとうございます。
    テンプレートを新しくして試してみたところ
    「A」「B」「C」や
    「A」「B」「C」「E」と表示されました!
    ありがとうございます!

    ご指摘のあった
    >[0]=> string(5) “E”
    >となっているので、何か余計な値が保存されていませんか?

    これは、valueの値を表示させるタイトルにあわせてたもので、
    実際には
    「AAAAAA」
    「BBBB」
    「CCCC」
    という値にしていたので(4)や(6)が表示されていたのだと
    思います。

    つまり、valueの値は揃えないと安定しないということでしょうか。

    PHPのsort関数につてはリンク先を見てもらうとして、今回のように配列の値をソートする前提なら、valueの値は単純なものにした方が無難です。(アルファベットではなく数字にすると確実かも)

    カスタムフィールドテンプレートであれば、valueとは別に
    valueLabel = apples # oranges # bananas
    の形で表示用ラベルを設定できます。

    トピック投稿者 naga0825

    (@naga0825)

    gatespaceさん、ご教示ありがとうございます。

    valueの値についてやsort関数については、
    目を通してみてもまだちょっと分からなかったです。
    これはPHPの勉強不足だと思うので、理解できるよう
    頑張りたいと思います。

    「valueLabel」、ちゃんと用意されていたんですね。
    気がつきませんでした。
    「value」を入れたら名前表示されたので
    そういうものだと勝手に解釈してました。
    だから不安定になったのかもしれません。

    本当にありがとうございました。

10件の返信を表示中 - 1 - 10件目 (全10件中)

トピック「Custom-field-templateで画像の表示順序がおかしくなる」には新たに返信することはできません。