Как подключить фильтр, чтобы поймать 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

Ответы:

8

После долгих раздумий с этим, я думаю, что нашел здесь довольно хорошее решение. Я понимаю, что прошло уже больше года с тех пор, как ты спросил, но это беспокоило меня, и я не мог найти хорошего решения до сих пор.

Проблема в том, что функция 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 без изменений и позволит изменить исходное значение.

joshcanhelp
источник
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.

forlogos
источник
Осторожно, это предотвратит кэширование отфильтрованной мета в кеше объектов. Решение @ joshcanhelp от этого не пострадает, так как оно все еще называетсяget_post_meta()
З. Златев
Это будет DDOS вашего сервера базы данных.
svandragt
Поправь на кеширование. get_post_meta лучше использовать, но в 2014 году он не работал в функции. Но сбой сервера БД - я так не думаю. Запрос get_var эквивалентен get_post_meta и является простым запросом. Даже если бы он запускался сотни раз на странице, это не привело бы к сбою сервера. Он работает на производстве с 2014 года без проблем.
Форлогос
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);
Марк Тирни
источник