Фильтр user_has_cap позволяет редактировать, но не позволяет сохранять

проблема

Я работаю над веб-сайтом, где нам нужно указать имя пользователя в настраиваемом поле настраиваемого типа сообщений и разрешить указанному пользователю вносить изменения в этот пост и только этот пост. Я думал, что user_has_cap будет использовать фильтр, но, похоже, он не позволяет пользователю обновлять сообщение.

Пользователь может видеть экран редактирования для сообщения и только этот пост, который подразумевает, что мой фильтр работает правильно, но нажатие на обновление дает ошибку. You are not allowed to edit posts as this user. что противоречит этому.

У типа post есть capability_type => post поэтому я считаю, что это не должно быть проблемой.

Код

 function event_cap_filter($all, $cap, $args) { // if not requesting edit post then return caps if('edit_post' != $args[0]) return $all; // if user can already edit others posts then return caps if($all['edit_others_posts']) return $all; // if user is the post author then return caps $post = get_post($args[2]); if($args[1] == $post->post_author) return $all; // query to find user in custom field // and therefore if they are allowed to edit this post if($can_edit) { foreach($cap as $c) { $all[$c] = true; } } return $all; } add_filter('user_has_cap', 'event_cap_filter', 10, 3); 

Вопрос

Если мой пользователь может отредактировать сообщение, в котором он указан в настраиваемом поле, которое я проверяю, почему он не может сохранить свои изменения? Я что-то пропускаю?

Solutions Collecting From Web of "Фильтр user_has_cap позволяет редактировать, но не позволяет сохранять"

Я боролся с той же проблемой … когда args [0] публикуется, args [2] не заполняется. Вы должны получить его из URL-адреса.

 if(substr($args[0],0,7)=="publish"){ $postid=$_GET["post"]; if(!isset($postid))return $allcaps; } else $postid=$args[2]; 

Я думаю, что вы сталкиваетесь с ошибкой в _wp_translate_postdata() которая заставляет его проверять edit_others_posts без предоставления каких-либо контекстов для map_meta_cap и других фильтров для использования в таких ситуациях, как ваша (где вы хотите, чтобы пользователь мог редактировать определенные сообщения, которые не принадлежат им) :

https://core.trac.wordpress.org/ticket/30452#comment:5

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

Билет включает в себя решение от Даниэля Бачубера, которое другие, вероятно, могут преобразовать в своих целях.

Надеюсь, ошибка будет исправлена ​​в ближайшее время.