在用户角色的内容之后尝试获取WordPress中非对象的属性‘Roles’时显示的错误

时间:2019-10-30 作者:Aditya Agarwal

当用户角色为\'administrator\' 或者是um_verified\'

老实说,我不知道这意味着什么,但我仍然想解决这个问题。此函数提取给定WordPress帖子的用户id,然后获取作者数据,使用作者数据找出用户角色,如果用户角色与if子句匹配,则会对其进行回显,整个函数将根据内容运行。

我对下面给出的代码的实现给出了正确的结果,基本上是可行的,但它显示了一个错误“试图获取非对象的属性‘角色’”,基本上这意味着该属性应该是一个对象。

我如何解决这个错误,基本上我知道有些地方出了问题,因为它在几个小时内就累积了大约5mb的错误。请帮助我更正代码,并解释对象在PHP中的含义。

function Milyin_After_Content($content) { 
        if( is_single() ):
        ob_start();

     $user_meta=get_userdata(get_the_author_meta(\'ID\'));
 $user_role=$user_meta->roles;
if (in_array("administrator", $user_role) | in_array("um_verified", $user_role)){
    echo \'<svg height="12pt" viewBox="0 0 512 512" width="12pt" xmlns="http://www.w3.org/2000/svg"><path d="m256 0c-141.164062 0-256 114.835938-256 256s114.835938 256 256 256 256-114.835938 256-256-114.835938-256-256-256zm0 0" fill="#1f1fff"/><path d="m385.75 201.75-138.667969 138.664062c-4.160156 4.160157-9.621093 6.253907-15.082031 6.253907s-10.921875-2.09375-15.082031-6.253907l-69.332031-69.332031c-8.34375-8.339843-8.34375-21.824219 0-30.164062 8.339843-8.34375 21.820312-8.34375 30.164062 0l54.25 54.25 123.585938-123.582031c8.339843-8.34375 21.820312-8.34375 30.164062 0 8.339844 8.339843 8.339844 21.820312 0 30.164062zm0 0" fill="#fff"/></svg>  
    \';}
        $code_content_2 = ob_get_clean();
        $content .= $code_content_2;
        endif;
        return $content;
    }

add_filter(\'the_content\', \'Milyin_After_Content_2\', 10);
这就是代码,我回显的代码只是普通的HTML,基本上是SVG标记,所以应该没有问题。如果有更好的方法或内置Wordpress函数来检查用户角色数组,那就更好了,但由于这是我找到的唯一方法,请帮助我调试并改进它。。。

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

PHP中的对象是一种可以阅读更多内容的数据类型data types here

最好在使用变量类型之前检查它们。在你的情况下,你假设$user_meta 是一个对象。因为您正在筛选the_content(), 它可能被称为其他地方并返回该错误。

以下是更新的代码is_object() 要在使用前检查该变量,请执行以下操作:

function Milyin_After_Content($content) { 
  if( is_single() ):
    ob_start();

    $user_meta=get_userdata(get_the_author_meta(\'ID\'));

    // NOTE: 
    // First check
    if(is_object($user_meta)){

      // Then set your variable here
      $user_role=$user_meta->roles;

      if (in_array("administrator", $user_role) || in_array("um_verified", $user_role)){
        echo \'<svg height="12pt" viewBox="0 0 512 512" width="12pt" xmlns="http://www.w3.org/2000/svg"><path d="m256 0c-141.164062 0-256 114.835938-256 256s114.835938 256 256 256 256-114.835938 256-256-114.835938-256-256-256zm0 0" fill="#1f1fff"/><path d="m385.75 201.75-138.667969 138.664062c-4.160156 4.160157-9.621093 6.253907-15.082031 6.253907s-10.921875-2.09375-15.082031-6.253907l-69.332031-69.332031c-8.34375-8.339843-8.34375-21.824219 0-30.164062 8.339843-8.34375 21.820312-8.34375 30.164062 0l54.25 54.25 123.585938-123.582031c8.339843-8.34375 21.820312-8.34375 30.164062 0 8.339844 8.339843 8.339844 21.820312 0 30.164062zm0 0" fill="#fff"/></svg>\';
      }
      $code_content_2 = ob_get_clean();
      $content .= $code_content_2;
    }

  endif;

  return $content;
}

add_filter(\'the_content\', \'Milyin_After_Content_2\', 10);

(还要注意上面@WebElaine的评论,在if()语句中应该使用两个管道。)

希望有帮助!