当替换自定义字段输出时,如何挂钩过滤器以捕获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年

Answers:


8

经过一番摸索之后,我认为我在这里找到了一个相当不错的解决方案。我知道这是您提出问题后的一年,但这困扰着我,直到现在我都找不到一个好的解决方案。

问题是get_post_metadata函数不允许您访问当前值。这意味着您无法转换值,只能替换它。我需要将内容附加到meta字段,并且在输出内容的地方不允许任何类型的过滤器。

这是我的解决方案,已更改为适合该问题的要求:

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年的时候,它不会在函数中运行。但是使数据库服务器崩溃-我认为不是。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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.