带有两个查询组合结果的WordPress PRE_GET_POST(OR)

时间:2017-08-23 作者:Julian Stark

我是wordpress开发的初学者。。。

我有一个用户角色“所有者”。那些拥有“机器”(自定义帖子类型)我希望管理员后端的所有者只看到自己的机器(所有者是作者的那些机器)和同一公司拥有的机器(机器的分类)。公司是用户的元字段,它应该与帖子的分类相匹配。

对于条件“相同的公司”,我将查询更改为仅过滤具有给定公司分类法的帖子(请参见“abc”)。

我如何扩展查询,以便用户即使没有填写公司字段,也能看到自己的帖子?

目标:查询(同一公司)或查询(同一作者)

function only_own_company( $query ) {
    global $typenow;
    $current_user = wp_get_current_user();
    $post_type = \'machine\'; // change to your post type
    $role = \'owner\';

    if ( $typenow == $post_type && current_user_can( $role ) ) {
        $query->set( \'tax_query\', array(
            array(
                \'taxonomy\' => \'company\',
                \'field\'    => \'slug\',
                \'terms\'    => \'abc\',
            ),
        ) );
    }
}
add_action( \'pre_get_posts\', \'only_own_company\' );
我试图将其与第二个新查询结合起来,但这似乎不是正确的方式。。。

$query2 = new WP_Query( array( \'author\', $current_user->ID ) );
$query->posts = array_merge( $query->posts, $query2->posts );

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

看见WP_Query 作为查询后过滤器的参考。您可以使用按作者筛选帖子\'author\' 使用分类法筛选帖子时查询var\'tax_query\' 查询变量。

然后,有条件地设置\'tax_query\' 根据用户的公司元字段查询var。如果为空,请设置\'author\' 改为查询var。

add_action( \'pre_get_posts\', \'alter_query\', 99, 1 );

function alter_query( $query ) {
    global $typenow;

    if ( \'machine\' === $typenow && current_user_can( \'owner\' ) ) {
        $user    = wp_get_current_user();
        $company = get_user_meta( $user->ID, \'company\', true );

        if ( \'\' !== $company ) {
            $query->set( \'tax_query\', array(
                array(
                    \'taxonomy\' => \'company\',
                    \'field\'    => \'slug\',
                    \'terms\'    => sanitize_key( $company ),
                ),
            ) );

        } else {
            $query->set( \'author\', $user->ID );
        }
    }
}
Note: sanitize_key() 可能是必要的,具体取决于您存储公司用户元价值的方式。它将字符串小写,并用连字符替换其中的空格。例如,WP使用它从帖子标题定义帖子的slug-换句话说,它“slugify”一个字符串。。。

结束

相关推荐

WP Query 'posts_per_page'

我有一个自定义的帖子类型Clinics 和Doctors. 每个诊所都有自己的clinic\\u id(通过自定义字段)。每个医生都有相同的领域clinic_id 他工作的诊所很多。我需要穿上single-clinic.php 显示在此工作的所有医生(将医生的clinic\\u id与当前页面的clinic\\u id进行比较)。为此,我创建了新WP_Query 对象和所有医生的列表,然后如果clinic\\u id(在clinic页上)==clinic\\u id(在doctors页上),则显示他们。问