是否在POST加载时通过相同的筛选器传递所有自定义域?

时间:2014-10-03 作者:Shawn

有没有办法过滤帖子上的所有自定义字段?

为了简单起见,我们假设:

标准字段:

自定义字段:

作者ISBN让我们假设在页面加载时,我想在每个自定义字段值的末尾附加123456,但我想使用过滤器来实现这一点。哪个add\\U过滤器可以实现这一点?一小段代码会很有帮助。

Edit as per the current top answer:

在找到最上面的答案后,我遇到了一个问题,即它只能在第一个字段上工作。然后我意识到我需要遍历每个元素,这就是我所拥有的。奇怪的是,数据看起来完好无损,但页面没有显示新数据。我的代码中有以下注释:

function my_post_meta_filters($null, $post_id, $key, $single){
    if(is_admin() || (substr($key, 0, 8) != \'_author_\' && substr($key, 0, 7) != \'_quote_\')){
        return $null;
    }

    static $filtered_values = NULL;

    if(is_null($filtered_values)){
        $cache = update_postmeta_cache(array($post_id));
        $values = $cache[$post_id];

        //must loop through all the fields or else only the first field is affected
        foreach($values AS $valkey => $value){                                   
            if(substr($key, 0, 8) == \'_author_\' || substr($key, 0, 7) == \'_quote_\'){
                $filtered[$valkey] = filtered($values[$valkey][0]);
                $filtered[$valkey] = maybe_serialize($filtered[$valkey]); //at this point the data is correct and even reserialized where expected
                $filtered_values[$valkey] = $filtered[$valkey];
            }
        }
        return $filtered_values;
    }
}
add_filter(\'get_post_metadata\', \'my_post_meta_filters\', 0, 4);

function filtered($it){
    if(!is_array($it) && !is_serialized($it)){
        $filtered = apply_filters(\'number_filter\', $it); //adds numbers to the end
    } else {       
        //otherwise we ran into a serialized array so lets unserialize and run each part through our function
        $unserialized = maybe_unserialize($it);
        $filtered = array_map(\'filtered\', $unserialized);
    }

    return $filtered;
}

1 个回复
SO网友:gmazzap

内部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 无需额外努力。

结束

相关推荐

注意:未定义索引:SUPPRESS_FILTERS

我正在做一个主题的除虫工作,我希望有人能帮助我。我使用JustinTadlock创建的这个函数在博客页面上显示自定义帖子类型,并且将wp debug设置为true,我会收到一个通知:未定义索引:suppress\\u filters消息。代码如下:// Custom Post Type for the public blog posts to show on Index or blog page add_filter( \'pre_get_posts\', \'my_get_posts\' );&