显示相关字段中的值-如果为空,则显示当前帖子类型的链接和标题

时间:2014-02-22 作者:Mia

我正在使用自定义帖子类型。在帖子类型奖项中,我有一个关系字段,将每个奖项链接到帖子类型项目中的一篇帖子。

我使用以下代码从该字段返回值-如果$work\\u value为空,则不应返回任何内容:

<?php 
$work_value = get_post_meta($post->ID, \'work\', false );
// check if the custom field has a value
if( ! empty( $work_value ) ) {
    foreach ( $work_value as $work ) { 
        //get id for related post and put in ID
        $id = $work[ \'ID\' ];
        //show the related post name as link
        echo \'for <a href="\'.get_permalink($id).\'">\'.get_the_title( $id ).\'</a> \';
    } //end of foreach
} //endif ! empty ( $work_value )
?>
但是,如果该字段为空(我选中了,它实际上为空),它将输出当前帖子的永久链接和标题(来自帖子类型奖励)。我如何解决这个问题?谢谢

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

get_post_meta() 仅应return false 在几种情况下:

269   function get_metadata($meta_type, $object_id, $meta_key = \'\', $single = false) {
270           if ( !$meta_type )
271                   return false;
272   
273           if ( !$object_id = absint($object_id) )
274                   return false;

https://core.trac.wordpress.org/browser/tags/3.8.1/src/wp-includes/meta.php#L269

我不知道怎么做$meta_type 可能是错误的,因为它是硬编码到get_post_meta():

1769  function get_post_meta($post_id, $key = \'\', $single = false) {
1770          return get_metadata(\'post\', $post_id, $key, $single);
1771  }

https://core.trac.wordpress.org/browser/tags/3.8.1/src/wp-includes/post.php#L1769

剩下的$object_id. 可能有东西传递了一个错误的对象ID--类似这样的。。。

$object_id = \'abc\';
// or this
// $object_id = -123;
var_dump(!$object_id = absint($object_id));
。。。将评估true 导致get_post_meta 返回false.

另一种可能性是,过滤器在此处返回有问题的值:

276           $check = apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, $single );
277           if ( null !== $check ) {
278                   if ( $single && is_array( $check ) )
279                           return $check[0];
280                   else
281                           return $check;
282           }
如果某些过滤器设置$check 到具有false 作为唯一的元素null !== $checktrue 然后返回该数组。例如:

add_filter(
  \'get_post_metadata\',
  function($meta) {
    return array(false);
  }
);
$t = get_post_meta(1,\'_edit_lock_dood\',false);
var_dump($t,empty($t));
注:简单returning公司false 从那个过滤器里过滤不出来。它必须是具有false 作为单个元素,这就说明了代码无法工作的技术原因。

empty(false)true 但是empty(array(false))false-- 数组不为空。它有一个元素,即使该元素是false. 玩var_dump() 一点,你可以自己演示一下。例如:

$a = array(false);
var_dump($a);
var_dump(empty($a));
您的问题/代码没有足够的上下文,我无法进一步缩小范围。

SO网友:Mia

我不知道我是否能找出这是什么原因。非常感谢您的帮助!与此同时,我意识到我可以使用这个:

<?php 
$work_value = get_post_meta($post->ID, \'work\', false );
// check if the custom field has a value
    foreach ( $work_value as $work ) { 
        if(is_array($work)) {
        //get id for related post and put in ID
        $id = $work[ \'ID\' ];
        //show the related post name as link
        echo \'for <a href="\'.get_permalink($id).\'">\'.get_the_title( $id ).\'</a> \';
        }
    } //end of foreach

?>

结束