如何在保存前过滤到POST元数据

时间:2018-09-25 作者:Abirvab

我使用的是一个插件,我想为我的客户提供一种在保存之前过滤数据的方法。我知道最好的方法是提供一个过滤器挂钩。因此,我引入了一个新的过滤器挂钩来过滤所有post数据,包括post数据和post元数据。

但后来我发现hook available for post data. 所以我意识到,没有必要引入另一个钩子来过滤post数据。

现在我想知道有没有这样的钩子可以用于post元数据?如果是这样,那么我就不需要提供任何新的过滤器挂钩,我可以从核心将用户引导到这些过滤器挂钩。

我发现an article by Igor Benic about metadata filter hook. 我尝试了以下代码及其一些差异:

function wpse22728_meta($check, $object_id, $meta_key, $meta_value, $unique) {
    if( get_post_type($object_id) == \'mycpt\' ) {
        if( $meta_key == \'mycustomkey\' ) {
            // var_dump($meta_value); //value going to store is: \'old_value\'
            return $meta_value = \'new_value\';
        }
    }
}

add_filter(\'add_post_metadata\', \'wpse22728_meta\', 20, 5);
add_filter(\'update_post_metadata\', \'wpse22728_meta\', 20, 5);
但实际上失败了。

如何在存储元数据之前过滤它们?还有其他的钩子吗?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

这个add_post_metadataupdate_post_metadata 过滤器仅用于过滤是否应保存(添加/更新)特定元数据。默认值(的$check) 是一个null, 如果您返回的不是null (即。!== null), 元数据将不会保存(到数据库中)。

但是add_metadata() 功能(由使用add_post_meta()) 以及update_metadata() 功能(由使用update_post_meta()), 两者都使用sanitize_meta() 用于清理meta值(虽然清理是通过过滤器完成的,而不是通过函数本身),以及Codex 表示:

应用可挂接的筛选器,以对特定元数据类型和键执行特定的清理过程。不会自行清理任何东西。必须连接自定义过滤器才能完成此工作。过滤器挂钩标记的形式为“sanitize_{$meta_type}_meta_{$meta_key}“。

所以在你的情况下$meta_type 可能是post, 和$meta_key 可能是mycustomkey, 您可以这样过滤值:

add_filter( \'sanitize_post_meta_mycustomkey\', function( $value ){
    return \'new_value\';
} );
同时检查此项example.

缺点不幸的是sanitize_meta() 不会将“对象”(例如post或user)ID传递给清理过滤器(即连接到sanitize_{$meta_type}_meta_{$meta_key}).

有一种方法可以克服这一点,但这取决于您的代码/上下文,因此我无法解释“如何”。

更新实际上,有一个棘手的问题(或黑客?)解决方案,可与add_post_metadataupdate_post_metadata 过滤器。但我这里还没有包含代码,您可以在Pastebin.

结束