Bagaimana cara mengaitkan filter untuk menangkap get_post_meta saat mengganti keluaran bidang khusus?

9

Bagaimana cara mengaitkan filter untuk menangkap get_post_meta saat mengganti keluaran bidang khusus?

Saya telah mengisi bidang khusus (meta data) dalam sebuah pos, seperti ini:

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

Saya perlu menerjemahkan output ini, jadi saya bertanya-tanya bagaimana cara menghubungkan ke "get_post_meta" sebelum meta data output.

Inilah yang saya coba selama beberapa hari, tetapi tidak berhasil.

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);
micheal
sumber
2
Apa yang Anda lakukan harus berhasil. "Nilai" apa yang belum dilewati?
s_ha_dum

Jawaban:

8

Setelah banyak bermain-main dengan ini, saya pikir saya menemukan solusi yang cukup bagus di sini. Saya menyadari ini lebih dari setahun setelah Anda bertanya tetapi ini mengganggu saya dan saya tidak bisa menemukan solusi yang baik sampai sekarang.

Masalahnya adalah bahwa fungsi get_post_metadata tidak memungkinkan Anda untuk mengakses nilai saat ini. Ini berarti Anda tidak dapat mengubah nilai, cukup ganti saja. Saya perlu menambahkan konten ke bidang meta dan di mana hasilnya tidak memungkinkan filter apa pun.

Inilah solusi saya, diubah agar sesuai dengan pertanyaan ini:

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 );

Ini akan menjaga filter get_post_metadata lainnya tetap utuh dan memungkinkan modifikasi nilai asli.

joshcanhelp
sumber
5

Baru saja mengalami masalah yang sama dan, menggunakan kode Anda di atas, berikut adalah cara saya menyelesaikannya:

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);

Saya mencoba menggunakan apply_filters, get_metadata, get_post_meta langsung dalam fungsi tetapi mereka tidak mengizinkan saya untuk memanipulasi hasil yang dihasilkan, jadi saya menggunakan $ wpdb.

forlogos
sumber
Hati-hati, ini akan mencegah meta yang difilter tidak di-cache dalam cache objek. Solusi @ joshcanhelp tidak akan menderita karena itu masih memanggilget_post_meta()
Z. Zlatev
Ini akan DDOS server database Anda.
svandragt
Benar tentang caching. get_post_meta lebih baik digunakan, tetapi pada saat kembali pada tahun 2014, itu tidak akan berjalan dalam fungsi. Tapi hancurkan server db - kurasa tidak. Permintaan get_var setara dengan get_post_meta dan merupakan permintaan sederhana. Bahkan jika dijalankan ratusan kali dalam satu halaman, itu tidak akan merusak server. Sudah berjalan di produksi sejak 2014 tanpa masalah.
forlogos
0

Inilah solusi saya untuk memfilter meta pos. Ini kemudian memanggil fungsi kustom untuk melakukan manipulasi data yang diperlukan.

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);
Tandai Tierney
sumber