У меня есть следующий фильтр, который должен удалять возможности редактирования для определенной роли пользователя для всех постов, кроме тех, для которых пользователь является автором, и другой особый пост.
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 (расширенный диспетчер доступа), который я использовал для изменения разрешений для разных пользовательских ролей. Вот список возможностей, которые назначены роли, для которой ожидается выполнение приведенного выше кода.
Я хотел бы знать, почему этот фильтр запрещает пользователю отправлять сообщения на проверку. Чтобы быть точным, access denied
ошибка дается во время запроса post.php
Для любого, кто может столкнуться с этим, я, конечно, не уверен, что это правильный путь, однако мне удалось сделать то, что я хотел.
В основном я добавил оператор if перед удалением возможностей
if ( (( 'publish' != $post->post_status ) || ( 'pending' != $post->post_status ) || ( 'auto-draft' != $post->post_status )) && ($post->post_author == $user_id) ) {
return $capauser;
}
Это проверяет, опубликована ли публикация в ожидании или черновик, и принадлежит ли она пользователю. Если эти условия выполняются, верните возможности такими, какими они были.
В документации есть очень похожий пример
Других решений пока нет …