Nigel
Supporter
Languages:
English (English )
Spanish (Español )
Timezone:
Europe/London (GMT+00:00)
But this is the same role where you *do* want the posts to appear on their author archive?
So your condition would be something like:
if ( !is_admin() && $query->is_archive() && !$query->is_author )
That would run your code to remove posts by users with the specified role on all archive pages except for author archives, which I think it what you need.
As I mentioned in my previous reply your condition for the page = 31 doesn't do anything because if the previous condition was met we've already established we are on an archive page, not a static page which may or may not have an id of 31.
I have two custom roles:
- PRODUCATOR NEAUTORIZAT: they can create ANUNTURI posts through the cred form but their posts are only shown on their own account page (ID 31 - a view is inserted that lists the posts of that author). This is just a temporaty role. The account page and the authors archive is not the same. The account page is for the logged in users to manage their content, the authors archive is for the public. That's why the exception.
- PRODUCATOR: Their posts should be shown in the author archive and every view where I query for the ANUNTURI post type.
So basically in every view where I query ANUNTURI post I want to show just the posts of PRODUCATOR role. But when on the account page (id 31) I need to show posts of every role.
This problematic function (remove_unvetted_authors) causes problems in every anunturi view, except the author archive. In author archives the view shows only the posts of authors with PRODUCATOR role. But all the other views show every post created by anybody.
Nigel
Supporter
Languages:
English (English )
Spanish (Español )
Timezone:
Europe/London (GMT+00:00)
OK, then in that case it sounds like for any query of ANUNTORI posts, unless we are on page 31, posts by authors with the role PRODUCATOR NEAUTORIZAT should be excluded.
So your code for that would be updated to:
add_filter('pre_get_posts', 'remove_unvetted_authors');
function remove_unvetted_authors($query)
{
if (!is_admin() && !is_page(31)) {
$post_type = $query->get('post_type');
if (isset($post_type) && $post_type == 'anunturi') {
$user_ids = get_users([
'role' => 'producator_neautorizat',
'fields' => 'ID',
]);
$query->set('author__not_in', $user_ids);
}
}
return $query;
}
Can you test that?
Yes, it seems that it is working now. THANK YOU!!!
I see that you used add_fliter instead of add_action, you removed the is_archive which is redundant and you limited it to the anunturi post type. Can you please explain me what caused the problem in my old function? The add_action?
Nigel
Supporter
Languages:
English (English )
Spanish (Español )
Timezone:
Europe/London (GMT+00:00)
Sorry, that was a typo, it should be add_action not add_filter.
The problem with your old function was simply that the logic was wrong. Once I understood what you required it was just a question of thinking through the tests for how to implement it.
In words the logic is effectively "except for page 31, everywhere on the frontend where anunturi posts are displayed, hide those from unauthorised authors".
The code is fairly simple, hopefully you can follow it.