サポート » 使い方全般 » カスタムフィールドの値(日本語)を、PHPで使用できるようにしたい

  • 解決済 spockey

    (@spockey)


    カスタムフィールドの値についての、質問です。
    現在、カスタムフィールドの値を、

    <?php echo get_post_meta($post->ID,$key,TRUE); ?>

    で、取得しております。

    元になるカスタムフィールドは、
    Custom Field GUI(http://www.tinybeans.net/blog/2008/03/wordpress-custom-field-gui.html)でカスタマイズしており、
    管理画面でプルダウンにより、項目を選べるようにしています。
    (たとえば「カエル」「ペンギン」「くじら」)

    取得している値が「カエル」だとして、
    この値を「PHPで使用できる英数」にできるものなのでしょうか。。

    ↓↓ というのは、

    <img src="<?php bloginfo('template_directory'); ?>/images/thumb- <?php *(ここに管理画面で選んだ値が直接入る感じ) ?>.gif" width="000" height="000" />

    上記のようなイメージタグを使い、
    選んだ値(「カエル」「ペンギン」「くじら」)によって、
    ページ内で表示させる画像をかえたいと思っています。
    「カエル」なら「images/thumb-flog.gif」、
    「ペンギン」なら「images/thumb-penguin.gif」、のようにです。

    ですので、

       (ここに管理画面で選んだ値が直接入る感じ)

    という事実現できる何かがあれば嬉しいのですが、
    どなたか、いい方法をご存知でしょうか?

    よろしくお願いいたします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • spocky さん、こんばんは。

    多分、対応する値を設定しておかないと PHP 単体でそういう処理を実現するのは難しいと思います。 (すぐ思いつくのは Google の Ajax Translation API を使って JSON で翻訳した単語を……とかですかね。ただ、JSON をパーズする必要があるのと、毎回呼び出すのはどうかと思うのでキャッシュしたりオプションとして保存したり余分な手続きが増えてしまいます。)

    spocky さんの場合、幸いカスタムフィールドの項目はプルダウンなので、「カエル」「ペンギン」「くじら」など値の種類がある程度決まっていると思いますので、カスタムフィールドで取得した値に対応した英数字を返す辞書的な関数を作成するのが妥当ではないでしょうか。

    // テーマの functions.php に追加
    // Usage: echo get_converted_post_meta( $post->ID, $key, true );
    function get_converted_post_meta( $post_id, $key, $single = false ) {
        $dic = array(
            'カエル' => 'flog',
            'ペンギン' => 'penguin',
            'くじら' => 'whale',
        );
        $post_meta = get_post_meta($post_id, $key, $single);
        // 対応するキーを持つ値が設定されていればその値を返す
        if ( isset($dic[$post_meta]) ) return $dic[$post_meta];
        // 未知の単語はそのまま返す。
        return $post_meta;
    }

    あとは、既にいくつもの投稿でカスタムフィールドの値を設定している場合、全ての投稿について値を再設定しなければならなくなる方法ですが、 Custom Field GUI の cfg-utility.class.php をちょっと改造すれば、カスタムフィールドに保存する値は英語に、プルダウンでの表示は日本語に、というような conf.ini の書式を実現することも出来ます。

    配布先の Custom Field GUI の最新版 (v3.0.2) でしたら、 174 行目からの foreach 文を以下のように変更します。

           foreach($values as $val ) {
                list( $val, $label ) = explode( '@', trim($val), 2 );
                if ( empty( $label ) ) $label = $val;
                $checked = ( trim($val ) == trim($selected ) ) ? ' selected="selected"' : '';
                $inside .= '<option class="data" value="' . $val . '"' . $checked . '> ' . $label. '</option>';
            }

    あとは、 conf.ini のプルダウン用の設定の value を以下のように「value@ラベル」という書式にすれば OK です。(default の書式は値のみにしないといけません。)

    [animal]
    fieldname = 動物
    type = select
    value = flog@カエル#penguin@ペンギン#whale@くじら
    default = flog

    この改造では、 value を # 区切りで設定した値を更に @ で前後 2 つに分割し、前者を通常の値として、後者をラベルとして使用します(@がない値の場合は、改造前と同じ動作をします)。

    ただし @ で前後に分割されるので、制限として @ を値の中で使用できなくなります。例えばプルダウンの項目にメールアドレスを設定したい場合にはおかしな挙動になってしまいます。

    そこで、そういう場合には @ 以外の文字で分割するようにカスタマイズする必要がありますが、内部で parse_ini_file() しているので、 ini ファイルの書式で利用されるいくつかの文字を含めるとエラーが発生したり予想外の挙動をします。

    他のプルダウン項目にメールアドレス欄があったり、カスタマイズする必要が生じた場合は、上記の

    list( $val, $label ) = explode( '@', trim($val), 2 );

    の ‘@’ の部分を使わなそうな文字列に書き換え、 conf.ini の書式もそれに合わせて変更するだけです。

    ただ、この方法ではプラグインがバージョンアップすると設定が無効になってしまったり、下手をすると予期せぬ動作を起こすようになるおそれもあるので、本来はおすすめすべきではありません。
    シンプルに最初の方法を使用されることをおすすめします。

    もっと言うと、パス名に関わるような値をプルダウンやチェックボックスで扱うときは全部英数字で統一すればいいんですけどね。

    トピック投稿者 spockey

    (@spockey)

    mizubeさん

    回答、ありがとうございます。
    「カスタムフィールドで取得した値に対応した英数字を返す辞書的な関数を作成する」方法でやってみようと思っています。

    funcsions.phpではなく、直接index.phpにループで使用したいのですが、
    キー名が「動物」場合、
    「$post_id」は「$post->ID」、「$key」は「’動物’」にして、そのまま使用できるのでしょうか?

    <?php
    function get_converted_post_meta($post->ID, '動物',FALSE ) {
        $dic = array(
            'カエル' => 'flog',
            'ペンギン' => 'penguin',
            'くじら' => 'whale',
        );
        $post_meta = get_post_meta($post->ID,'動物',TRUE);
        if ( isset($dic[$post_meta]) ) return $dic[$post_meta];
        return $post_meta;
    }
    ?>

    ちょっと書いてみたのですが、
    表示されませんでした。。
    PHP始めたばかりで、あまり分かってない部分あるので、
    何かが間違ってるのだとおもうのですが、
    お時間ある時にでも指摘いただければ、幸いです。

    よろしくおねがいします。

    何かが間違ってる

    index.php のループ中で
    echo get_converted_post_meta($post->ID, '動物');
    てな感じで functions.php に書いた関数を利用するのが正解です。

    > kz さん
    簡潔でこれ以上ない補足をありがとうございました!

    > spockey さん
    説明が足りなかったようでごめんなさい。あと、お名前間違ってました。ごめんなさい。

    関数の使用方法については、 kz さんがしてくださった補足の通りです。

    1. テーマの functions.php (なければ作成、<?php ?> の中) にコードを追加
    2. index.php の中の対象となる get_post_meta() を get_converted_post_meta() に置き換え

    関数は呼び出してあげないと、記述するだけでは何もしてくれません。それが通常のコードとの大きな違いです。逆に言えば、spockey さんがイメージしたように、 index.php に直接記述したい場合は関数にしないという方法もあります。

    <?php
    //関数を使用しない方法
    $animal = get_post_meta($post->ID, $key, true);
    $dic = array(
        'カエル' => 'flog',
        'ペンギン' => 'penguin',
        'くじら' => 'whale',
    );
    if ( isset( $dic[$animal]) ) {
        echo $dic[$animal];
    } else {
        echo $animal;
    }
    ?>

    しかし、テーマの多くは index.php 以外のテンプレートファイルも利用するので、テーマの single.php や category.php などでも全く同じコードを記述する必要があります。 $dic の定義なんて、新しい項目を追加するたび各ファイルごとに修正する必要が出てきてしまいます。
    定義は一度で済んだ方がいいですよね? 関数としてまとめておくと、そういう場合に修正もれがなくなったり、色々とメリットがあるわけです。

    使用中のテーマの functions.php は、管理ページや、同じテーマ内の別のテンプレートファイルが呼び出される前に必ず読み込まれるようになっているので(もし functions.php のないテーマでも functions.php を作成しさえすればちゃんと読み込まれます)、 index.php 以外のテンプレートファイルでも、functions.php に記述してある関数は共通して利用することが出来ます。

    なので、WordPress のテーマを作成する際、自分でテーマ用の関数を定義した場合は、テーマの functions.php にまとめておくのが一般的なわけです。

    トピック投稿者 spockey

    (@spockey)

    mizubeさん kzさん

    おっしゃるとおり、functions.phpを作成して関数を追加し、
    しかるべき部分で

    <?php echo get_converted_post_meta($post->ID, '動物',TRUE); ?>

    で、できました!
    完璧に実現できて、嬉しいかぎりです、
    どうもありがとうございました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「カスタムフィールドの値(日本語)を、PHPで使用できるようにしたい」には新たに返信することはできません。