Conditional Tag for has post

时间:2016-04-13 作者:Thomas

我对所有的编程都很陌生,现在我被以下内容困住了。

我安装了插件If Menu 它允许您在条件语句为true或false时显示特定的菜单项。我想在登录用户发表帖子时显示一个菜单项,但要使用自定义的帖子类型,在我的示例中称为job\\u list。

如果菜单中给出了此示例:

    // theme\'s functions.php or plugin file
add_filter( \'if_menu_conditions\', \'my_new_menu_conditions\' );

function my_new_menu_conditions( $conditions ) {
  $conditions[] = array(
    \'name\'    =>  \'If single custom-post-type\', // name of the condition
    \'condition\' =>  function($item) {          // callback - must return TRUE or FALSE
      return is_singular( \'my-custom-post-type\' );
    }
  );

  return $conditions;
}
它用于在显示特定帖子类型时显示菜单项。我现在把它改成这样,但它实际上不起作用:

function my_new_menu_conditions( $conditions ) {
 $conditions[] = array(
    \'offset\'       => 0,
    \'author\'       => \'$current_user\',
    \'post_type\'    => \'job_listing\',
    \'post_status\'  => \'publish\',
    \'name\'    =>  \'If User has Listing\', // name of the condition
    \'condition\' =>  function( ) {  // callback - must return TRUE or FALSE
      return get_posts( $conditions );
    }
  );

  return $conditions;
}
现在,当网站上有帖子时,菜单项会显示出来。因此,有两个问题:-代码仍然查找帖子,而不是job\\u列表-该语句仍然适用于所有帖子,而不是登录用户的帖子。我猜数组不是这样工作的。

谁能帮我一下吗?我已经厌倦了我所做的所有尝试,而不知道我到底在做什么。

提前感谢!

1 个回复
SO网友:bosco

我不熟悉这个插件,但它似乎不太可能$conditions 要添加到的数组应包含各种WordPress查询参数。此外,参考$conditions 您在该数组上设置的属性中的数组不会包含您添加的新数据,而是包含添加之前存在的数组(即。get_posts( $conditions ) 不会传递您添加到的所有查询参数get_posts()). 只需将键保留为示例所示,并将您的查询参数传递给查询,而不是试图将它们推送到$conditions 变量:

function my_new_menu_conditions( $conditions ) {
  $conditions[] = array(
    \'name\'    =>  \'If User has Listing\', // name of the condition
    \'condition\' =>  function( ) {        // callback - must return TRUE or FALSE
      $args = array(
        \'offset\'       => 0,
        \'author\'       => \'$current_user\',
        \'post_type\'    => \'job_listing\',
        \'post_status\'  => \'publish\'
      );

      return get_posts( $args );
    }
  );

  return $conditions;
}
下一个问题是示例代码说明condition 必须返回TRUEFALSE - 如果您查看文档the get_posts() function, it详细信息

返回值

(array)

WP\\U Post对象列表。

因此插件需要一个布尔值(true/false) 值,并通过返回get_posts() 相反,它接收一个数组(用post填充或为空)。插件可以将该数组解释为truefalse 取决于它如何测试"truthiness"condition\'s返回值。不必亲自挖掘插件代码,最好是安全的,并在插件请求时显式返回布尔值。

在这里,您希望返回true 如果您的查询发现任何(超过0)帖子,那么:

function my_new_menu_conditions( $conditions ) {      
  $conditions[] = array(
    \'name\'    =>  \'If User has Listing\', // name of the condition
    \'condition\' =>  function( ) {        // callback - must return TRUE or FALSE
      $args = array(
        \'offset\'       => 0,
        \'author\'       => \'$current_user\',
        \'post_type\'    => \'job_listing\',
        \'post_status\'  => \'publish\'
      );

      $posts = get_posts( $args );

      return 0 < count( $posts );
    }
  );

  return $conditions;
}
不过,这里还有许多其他问题

PHP将以双引号计算字符串"" 用于变量替换,但处理单引号\'\' “作为”;字符串文字“-”这意味着您的查询实际上是在向WordPress询问用户编写的帖子\'$current_user\' 而不是变量的值$current_user. 您可以通过将变量名放在双引号中,或者干脆不加引号来解决这个问题$current_user 从未在筛选器中的任何位置声明。如果您在更高的scope, 例如函数所在文件的顶部。但是,在本例中,您希望使用WordPress global variable $current_user - 所以要确保$current_user 如果引用了正确的数据,则应通过添加global $current_user;. 然而,这有点像黑客——获取当前用户的首选方法是wp_get_current_user() function.the Codex entry on author query parameters, \'author\' 应为整数,而global $current_user 和返回值wp_get_current_user() function 返回aWP_User object. 您可以从WP_User 对象,即。$id = $current_user->ID;, 或者,您可以抄近路,只需拨打get_current_user_id() function.\'offset\' 属于0 是隐含的,因此可以省略参数。实际上,您只关心是否至少有一篇文章符合您的条件,因此我们可以通过设置\'posts_per_page\'1. 如果没有当前用户(即访客),则根本没有理由运行查询-我们可以通过检查0.

总而言之:

add_filter( \'if_menu_conditions\', \'wpse_223598_add_menu_conditions\' );

function wpse_223598_add_menu_conditions( $conditions ) {      
  $conditions[] = array(
    \'name\'    =>  \'If Current User has Authored Listing\',
    \'condition\' =>  function( ) {
      $current_user_id = get_current_user_id();

      // If the user\'s not logged in, they can\'t have authored a listing
      if( 0 === $current_user_id )
        return false;

      $args = array(
        \'posts_per_page\' => 1,
        \'author\'         => $current_user_id,
        \'post_type\'      => \'job_listing\',
        \'post_status\'    => \'publish\'
      );

      $listings = get_posts( $args );

      // Return "there are more than 0 listings"
      return 0 < count( $listings );
    }
  );

  return $conditions;
}

相关推荐

如何修改WP_INCLUDE/BLOCKS/LATEST_posts.php

我是WordPress开发的初学者,希望得到一些帮助。我在一个简单的WordPress网站上工作。基本上,用户希望在主页上显示最新的帖子。我使用了最新帖子块,并将其设置为显示整个帖子内容,现在用户不希望帖子标题链接到单个帖子页面(因为帖子的内容显示在主页上)。如何安全地修改模板文件,使其像h2标记一样使用,而不是在主题中使用的href标记。我知道您可以创建子主题并修改wp_content 文件,但我不确定如何处理中的文件wp_include. 我读到一些关于修改functions.php 但我不确定,如果