カスタムフィールド出力を代替するときに、フィルターをフックしてget_post_metaをキャッチする方法


9

カスタムフィールド出力を代替するときに、フィルターをフックしてget_post_metaをキャッチする方法

次のように、投稿にカスタムフィールド(メタデータ)を入力します。

<!--:de-->Nominale spanning<!--:--><!--:zh/cn-->额定电压<!--:--><!--:en-->Arrester Accessories<!--:-->

この出力を翻訳する必要があるので、メタデータ出力の前に「get_post_meta」にフックする方法を知りたいです。

数日間試してみましたが、うまくいきません。

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single){
    $fieldtitle="fields_titles";
    if($meta_key==$fieldtitle&& isset($meta_key)){
         //here is the catch, but no value has been passed
    }
}
//Specify 4 arguments for this filter in the last parameter.
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);

2
あなたがやっていることはうまくいくはずです。渡されていない「値」は何ですか?
s_ha_dum 2013年

回答:


8

これを何度もいじった後、私はここでかなり良い解決策を見つけたと思います。これはあなたが尋ねてから1年以上経過していることに気づきましたが、これは私を悩ませていて、今まで良い解決策を見つけることができませんでした。

問題は、get_post_metadata関数では現在の値にアクセスできないことです。つまり、値を変換することはできず、単に置き換えるだけです。コンテンツをメタフィールドに追加する必要があり、コンテンツが出力された場所では、どのような種類のフィルターも許可されませんでした。

これが私の解決策です。この質問が尋ねるものに合うように変更されました:

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single){

    // Here is the catch, add additional controls if needed (post_type, etc)
    $meta_needed = 'fields_titles';
    if ( isset( $meta_key ) && $meta_needed == $meta_key ){
        remove_filter( 'get_post_metadata', 'getqtlangcustomfieldvalue', 100 );
        $current_meta = get_post_meta( $object_id, $meta_needed, TRUE );
        add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 100, 4);

        // Do what you need to with the meta value - translate, append, etc
        // $current_meta = qtlangcustomfieldvalue_translate( $current_meta );
        // $current_meta .= ' Appended text';
        return $current_meta;
    }

    // Return original if the check does not pass
    return $metadata;

}

add_filter( 'get_post_metadata', 'getqtlangcustomfieldvalue', 100, 4 );

これにより、他のget_post_metadataフィルターはそのまま保持され、元の値を変更できます。


5

ちょうど同じ問題があり、上記のコードを使用して、ここに私がそれを解決した方法があります:

function getqtlangcustomfieldvalue($metadata, $object_id, $meta_key, $single) {
    $fieldtitle="fields_titles";
    if($meta_key==$fieldtitle&& isset($meta_key)) {
        //use $wpdb to get the value
        global $wpdb;
        $value = $wpdb->get_var( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = $object_id AND  meta_key = '".$meta_key."'" );

        //do whatever with $value

        return $value;
    }
}
add_filter('get_post_metadata', 'getqtlangcustomfieldvalue', 10, 4);

関数内でapply_filters、get_metadata、get_post_metaを直接使用してみましたが、結果の出力を操作できないため、$ wpdbを使用しました。


これにより、フィルタリングされたメタがオブジェクトキャッシュにキャッシュされなくなります。@ joshcanhelpのソリューションは受けないだろうから、それはまだ呼び出すので、そのget_post_meta()
Z. Zlatev

これにより、データベースサーバーがDDOSされます。
svandragt

キャッシュを修正します。get_post_metaを使用することをお勧めしますが、2014年の時点では、関数では実行されません。しかし、dbサーバーをクラッシュさせます-そうは思いません。get_varクエリはget_post_metaと同等で、単純なクエリです。ページ上で何百回実行されたとしても、サーバーはクラッシュしません。2014年から問題なく稼働しています。
forlogos

0

これがポストメタをフィルタリングするための私のソリューションです。次に、カスタム関数を呼び出して、必要なデータ操作を実行します。

public function filter_post_meta($metadata = null, $object_id, $meta_key, $single)
{
    $meta_cache = wp_cache_get($object_id, 'post_meta');

    if ( !$meta_cache ) {
        $meta_cache = update_meta_cache( 'post', array( $object_id ) );
        $meta_cache = $meta_cache[$object_id];
    }

    if ( ! $meta_key ) {
        foreach ($meta_cache as $key => $val) {
            foreach ($val as $k => $v) {
                $meta_cache[$key][$k] = yourCustomFunction($v);
            }
        }

        return $meta_cache;
    }

    if ( isset($meta_cache[$meta_key]) ) {
        if ( $single ) {
            $value = maybe_unserialize( $meta_cache[$meta_key][0] );

            return yourCustomFunction($value);
        } else {
            return array_map(
                'maybe_unserialize',
                array_map(
                    'yourCustomFunction',
                    $meta_cache[$meta_key]
                )
            );
        }
    }

    return $single ? '' : [];
}

add_filter('get_post_metadata', 'filter_post_meta', 100, 4);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.