web-dev-qa-db-ja.com

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

カスタムフィールド出力を代替するときに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);
8
micheal

これをたくさんいじった後、私はここでかなり良い解決策を見つけたと思います。私はこれがあなたが尋ねた後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フィルタはそのまま残り、元の値を変更できます。

8
joshcanhelp

ちょうど同じ問題を抱えていて、上のコードを使って、私がそれを解決した方法は次のとおりです。

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を使用しました。

5
forlogos

これが投稿メタをフィルタリングするための私の解決策です。次にこれはカスタム関数を呼び出して必要なデータ操作を実行します。

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);
0
Mark Tierney