我不熟悉这个插件,但它似乎不太可能$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
必须返回
TRUE
或
FALSE
- 如果您查看文档
the get_posts()
function, it详细信息
返回值
(array)
WP\\U Post对象列表。
因此插件需要一个布尔值(true
/false
) 值,并通过返回get_posts()
相反,它接收一个数组(用post填充或为空)。插件可以将该数组解释为true
或false
取决于它如何测试"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;
}