如何在替换自定义字段输出时挂钩筛选器以捕获get_post_meta?

时间:2013-11-08 作者:micheal

当替换自定义字段输出时,如何钩住过滤器以捕获get\\u post\\u meta?

我在帖子中填写了一个自定义字段(元数据),如下所示:

<!--:de-->Nominale spanning<!--:--><!--:zh/cn-->额定电压<!--:--><!--:en-->Arrester Accessories<!--:-->
我需要翻译这个输出,所以我想知道如何在元数据输出之前连接到“get\\u post\\u 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);

3 个回复
SO网友:joshcanhelp

在对这个问题进行了大量处理之后,我想我在这里找到了一个相当好的解决方案。我意识到这是一年多前你提出的问题,但这让我很困扰,直到现在我才找到一个好的解决方案。

问题是get\\u post\\u 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\\u post\\u元数据过滤器不变,并允许修改原始值。

SO网友:forlogos

刚才遇到了同样的问题,使用上面的代码,下面是我如何解决它的:

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\\u过滤器、get\\u元数据、get\\u post\\u元数据,但它们不允许我操作结果输出,所以我求助于使用$wpdb。

SO网友:Mark Tierney

这是我过滤post meta的解决方案。然后调用自定义函数来执行任何所需的数据操作。

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

结束

相关推荐

Too many actions/filters!

这里是wordpress的新成员。动作/过滤器的概念本身并不难理解。令我不知所措的是大量可用的操作和过滤器。当我阅读教程/指南时,他们会说“只需将此功能添加到wp\\U head操作或after\\U setup\\u主题”。如果没有这些教程,我究竟如何知道将该函数与该操作挂钩?作为一个初学者,我怎么会知道什么是合适的操作?有没有关于如何导航的建议?谢谢