内部post meta通过几乎不可过滤的对象缓存进行处理。
筛选帖子元数据的唯一机会是使用\'get_post_metadata\'
, 但该过滤器是在元数据不可用时触发的,因此没有什么可过滤的,其目的不仅仅是为了过滤它们,而是为了缩短结果。
因此,我建议的解决方案是:
启动一个在该筛选器上运行的函数,并手动检索元数据。检索后,触发一个自定义筛选器,以便能够筛选刚刚检索到的数据。将so筛选后的值存储在一个静态变量中,以避免在后续调用中再次运行db查询。最后,向我们的自定义挂钩添加一个回调(在点2添加)并筛选数据,首先添加过滤器:
add_filter( \'get_post_metadata\', \'my_post_meta_filters\', 0, 4 );
然后编写挂钩回调
function my_post_meta_filters( $null, $pid, $key, $single ) {
if ( ! in_array( $key, array( \'author\', \'ISBN\', \'quote\', \'\' ), TRUE ) || is_admin() ) {
return $null;
};
static $filtered_values = NULL;
if ( is_null( $filtered_values ) ) {
$cache = update_meta_cache( \'post\', array( $pid ) );
$values = $cache[$pid];
$raw = array(
\'author\' => isset( $values[\'author\'] ) ? $values[\'author\'] : NULL,
\'ISBN\' => isset( $values[\'ISBN\'] ) ? $values[\'ISBN\'] : NULL,
\'quote\' => isset( $values[\'quote\'] ) ? $values[\'quote\'] : NULL,
);
// this is the filter you\'ll use to filter your values
$filtered = (array) apply_filters( \'my_post_meta_values\', $raw, $pid );
foreach ( array( \'author\', \'ISBN\', \'quote\' ) as $k ) {
if ( isset( $filtered[$k] ) ) $values[$k] = $filtered[$k];
}
$filtered_values = $values;
}
if ( $key === \'\' )
$filtered_values;
if ( ! isset( $filtered_values[$key] ) )
return;
return $single
? maybe_unserialize( $filtered_values[$key][0] )
: array_map( \'maybe_unserialize\', $filtered_values[$key] );
}
在代码中使用此函数,您将能够使用自定义
\'my_post_meta_values\'
滤器
举个例子:
add_filter( \'my_post_meta_values\', function( $values, $post_id ) {
// append \'123456\' to all values
if ( is_array( $values[\'author\'] ) ) {
$values[\'author\'][0] .= \' 123456\';
}
if ( is_array( $values[\'ISBN\'] ) ) {
$values[\'ISBN\'][0] .= \' 123456\';
}
if ( is_array( $values[\'quote\'] ) ) {
$values[\'quote\'][0] .= \' 123456\';
}
return $values;
}, 10, 2 );
此筛选器处于活动状态时,如果执行以下操作:
echo get_post_meta( $post_id, \'author\', TRUE );
“author”自定义字段设置为“Shawn”,而输出为“Shawn 123456”。
请注意my_post_meta_filters
还与兼容get_post_custom
无需额外努力。