サポート » 使い方全般 » カスタムフィールドの文字の置換について

  • お世話になります。
    カスタムフィールドが出力する文字を置換したいと思うのですが上手くいきません。
    http://www.codre.net/wordpress-snippets/replace-text-function-wordpress
    リンク先サイトの記述では投稿本文の置換は可能ですが、カスタムフィールドには効きませんでした。
    the_contentをthe_metaに変えてみたりしましたが駄目でした。

    データベースを書き換えるのではなく、出力される特定の文字だけを書き変えたり色を付けたりする程度のいわば上辺だけの置換をしたいのですが、そもそもカスタムフィールドの値などから出力する文字にそのような事は出来ないのでしょうか。

    以上、宜しくお願い申し上げます。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • こんにちは、

    カスタムフィールドキー otamesi
    フィールドの値 otamesi val

    25656は、投稿ID

    add_filter( 'get_post_metadata', 'my_filter', 10, 4 );
    
    function my_filter( $return, $obj_id, $meta_key, $single ) {
    
        if ( $meta_key == 'otamesi' ) {
            return 'おまじない';
        }
        return $return;
    }
    
    echo get_post_meta( 25656, 'otamesi', true );

    ただ、カスタムフィールドは、キャッシュされる関係で、上のフィルタは、普通のフィルタとは違って、$return は、常に nullになりますので、値をhtml要素で囲む、などといった場合はフィルタ関数内で、

    get_post_meta( 25656, 'otamesi', true );

    と、わざわざ呼び出す必要がありそうです。

    トピック投稿者 k-morita

    (@k-morita)

    nobita様 ありがとうございます。
    試してみたのですが・・・
    イマイチ使い方が分からないと言いますか・・・
    説明不足もありました。
    置換したい文字列は特定の投稿の特定の文字列ではなく、複数の投稿に挿入される複数のカスタムフィールドの値で、可能ならば先の書き込みに記述しましたリンク先のように
    置換する文字、置換後の文字を指定できればありがたいのですが、

    カスタムフィールドは、キャッシュされる関係で

    ということですので無理なのでしょうか。

    以上、宜しくお願い申し上げます。

    ということですので無理なのでしょうか。

    全然無理じゃありません。

    置換すること自体は、フィルタを使わなくてもできますが、

    もう少し、具体的に書いてもらえますか?

    ループの中で使うのか、外なのか?

    どういう文字を、どのように変更するのか等をできるだけ詳しく書いてもらえますか?

    トピック投稿者 k-morita

    (@k-morita)

    nobita様 ありがとうございます。

    すみません。
    もう少し詳しく書きます。

    使用するのはループ外です。
    投稿毎にカスタフィールドに特定の文字を入力する場合があります。
    例えば『りんご』としますが、『りんご』の文字を投稿毎にカスタムフィールドに手入力するのですが、『りんご』の文字を投稿で出力する際に赤色の文字に出来ればと考えています。
    装飾したい文字列は決まったもので5つ程度だけです。
    ですので先に記しましたリンク先の方法で書きますと

    'りんご' => '<span style="color: #ff0000;">りんご</span>'

    などと出来ればと考えていました。

    カスタムフィールドの入力時にHTMLで『りんご』を赤色にしてしまう方法もあると思いますが、『りんご』を他で使う際には赤色にしなくても良い為、個別投稿でのみ色を変えられれば良いのです。
    ですのでデータベースHTMLを保存しなくても良いのです。

    以上、よろしくお願い申し上げます。

    一例です functions.phpに追加してください

    <?php
    function my_get_post_meta( $custom_field_key, $style = '' ) {
    
        global $post;
        $wrapper = '<span style="%1$s">%2$s</span>';
    
        if ( !isset( $post ) ) {
    
            return;
        }
    
        $custom_field_value = get_post_meta( $post->ID, $custom_field_key, true );
    
        if ( !empty( $style ) && !empty( $custom_field_value ) ) {
    
            $result = sprintf( $wrapper, esc_attr( $style ), $custom_field_value  );
            return apply_filters( 'my_get_post_meta', $result );
        }
    
        return apply_filters( 'my_get_post_meta', $custom_field_value );
    }
    ?>

    必要な個別投稿で、

    <?php echo my_get_post_meta('otamesi','color:blue;'); ?>

    引数について、

    一番目 カスタムフィールドの名前(キー)
    二番目 適用するスタイル宣言ブロックの中身(background:yellow; みたいな感じで記述、空なら、span要素でラップされません)

    トピック投稿者 k-morita

    (@k-morita)

    nobita様 ありがとうございます。

    詳細を書いたつもりなのに詳細ではありませんでした。

    値は『りんご』だけではなく『りんご』の『説明』も同一の値に含みます。
    また別のパターンでは値に『みかん』と『説明』があるのですが、
    『説明』は装飾したくないので『りんご』や『みかん』だけが装飾できればと考えています。
    折角考えていただいたのにすみません。

    以上、よろしくお願い申し上げます。

    いま、カスタムフィールドを出力するために使用している関数を教えてください

    トピック投稿者 k-morita

    (@k-morita)

    nobita様 ありがとうございます。

    カスタムフィールドの名前 くだもの

    カスタムフィールドの値
    りんご
    バラ科リンゴ属の落葉高木樹。

    以上を入力して以下で表示させています。

    <?php echo nl2br(get_post_meta($post->ID , 'くだもの' ,true)); ?>

    このようにしていたのですが最近Advanced Custom Fieldsを使いたいと思い以下を使っています。

    <?php $fields = get_field_objects(); if( $fields ): ?>
    <?php foreach( $fields as $field ): ?>
    <?php if( $field['value'] ): ?>
    <?php echo $field['value']; ?>
    <?php endif; ?>
    <?php endforeach; ?>
    <?php endif; ?>

    Advanced Custom FieldsでWYSIWYGエディタを使う方法も考えましたが操作方法等の問題から断念しました。

    以上、宜しくお願い申し上げます。

    はい、できました

    <?php
    /* テストで使用したカスタムフィールド
     * カスタムフィールド名 果物
     * 値
     *
    リンゴ
    
    アダムとイブに出てくるやつで、パソコンには、食いかけのものが光っていることがある
     */
    
    function my_get_post_meta( $custom_field_key, $hilight_rules ) {
    
        global $post;
    
        $checksum      = crc32( $custom_field_key );
        $class_name    = trim( sprintf( "field-%u\n", $checksum ) );
        $wrapper       = '<span style="%1$s">%2$s</span>';
        $block_wrapper = '<div class="%1$s">%2$s</div>';
    
        if ( !isset( $post ) ) {
    
            return;
        }
        /* キーワードのリプレース*/
        $custom_field_values = get_post_meta( $post->ID, $custom_field_key, true );
    
        foreach ( $hilight_rules as $value ) {
    
            $name                = key( $value );
            $replace_value       = sprintf( $wrapper, esc_attr( $value[$name] ), $name );
            $custom_field_values = str_replace( $name, $replace_value, $custom_field_values );
        }
        /* フィールドをdiv クラス付(カスタムフィールドキーが変わるとクラス名も変わります ) */
        $custom_field_values = sprintf( $block_wrapper, $class_name, wpautop( $custom_field_values ) );
    
        return apply_filters( 'my_get_post_meta', $custom_field_values );
    }
    ?>
    <?php
    // テンプレート
    
    スタイルを適用する文字は、何個でも書けます。
    <?php
    
    $hilight_rules = array(
                        array('リンゴ'=>'color:red;'),
                        array('パソコン'=>'color:blue;'),
                        array( 'アダム'=>'color:yellow;')
                    );
    echo my_get_post_meta('果物', $hilight_rules); 
    
    ?>
9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「カスタムフィールドの文字の置換について」には新たに返信することはできません。