WordPress — ловушка user_has_cap вызывает отказ в доступе при отправке на проверку

У меня есть следующий фильтр, который должен удалять возможности редактирования для определенной роли пользователя для всех постов, кроме тех, для которых пользователь является автором, и другой особый пост.

function allow_user_to_edit_cpt_filter( $capauser, $capask, $param){

if ( $user->roles[0] == 'aamrole_53e5009d7c32d' ) {

// code to get the id of the organisation post
$organisation_post = get_field('select_organisation', "user_$user_id") ;

$user_posts = $wpdb->get_results( "SELECT id, FROM wp_posts  WHERE post_author = " . $user_id , ARRAY_B );
$allowed_posts = array();

$user_posts = get_posts( $args );

if( !empty($user_posts) ){
foreach($user_posts as $post){
$allowed_posts[] = $post->ID;
}
}
$allowed_posts[] =  $organisation_post;

//$allowed_posts = array(2376, 3091);
$post = get_post( $param[2] );

//If  post isn't allowed then remove edit capabilities on that post
if( !in_array( $post->ID, $allowed_posts ) ){
if( ( $param[0] == "edit_post" ) || ( $param[0] == "edit_published_posts" ) || ( $param[0] == "edit_others_posts" ) ) {
foreach( (array)$capask as $capasuppr ) {
if ( array_key_exists($capasuppr, $capauser) ) {
$capauser[$capasuppr] = 0;
}
}
}
}
}
return $capauser;
}
add_filter('user_has_cap', 'allow_user_to_edit_cpt_filter', 100, 3 );

Проблема с этим кодом заключается в том, что он не позволяет пользователю отправить сообщение на проверку. У меня также установлен AAM (расширенный диспетчер доступа), который я использовал для изменения разрешений для разных пользовательских ролей. Вот список возможностей, которые назначены роли, для которой ожидается выполнение приведенного выше кода.

  • загрузить файлы
  • edit_posts
  • edit_others_posts
  • edit_published_posts
  • читать
  • 1-й уровень
  • уровень 0
  • create_users
  • list_users
  • add_users

Я хотел бы знать, почему этот фильтр запрещает пользователю отправлять сообщения на проверку. Чтобы быть точным, access denied ошибка дается во время запроса post.php

1

Решение

Для любого, кто может столкнуться с этим, я, конечно, не уверен, что это правильный путь, однако мне удалось сделать то, что я хотел.

В основном я добавил оператор if перед удалением возможностей

if ( (( 'publish' != $post->post_status ) || ( 'pending' != $post->post_status ) || ( 'auto-draft' != $post->post_status )) && ($post->post_author == $user_id) ) {
return $capauser;
}

Это проверяет, опубликована ли публикация в ожидании или черновик, и принадлежит ли она пользователю. Если эти условия выполняются, верните возможности такими, какими они были.

В документации есть очень похожий пример

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]