私はこの問題に遭遇しました、そこでは以下のコードはそれに供給されるどんなpost ID
のためにでも常に真を返します。
current_user_can('delete_posts', $post_id);
通常、上記のコードは、ユーザーが投稿の作成者ではない場合、または他の投稿を削除する機能がない場合にfalseを返します。ただし、投稿IDに対してはtrueが返されます。
以下に定義されているように、ユーザーにはカスタムロールが割り当てられています。
$standard_role_capabilities = array ('read' => true,
'delete_posts' => true,
'edit_posts' => true,
'delete_published_posts' => true,
'publish_posts' => true,
'edit_published_posts' => true,
'comment' => true
);
add_role('standard', 'Standard', $standard_role_capabilities);
これが機能しない理由は何ですか?
これを機能させるための何時間もの戦いの後、それはdelete_posts
をdelete_post
に変更することの問題でした。
したがって、全体としてこれは次のようになります。
current_user_can('delete_posts', $post_id);
に
current_user_can('delete_post', $post_id);
current_user_can
は2番目のパラメーターを受け入れます。 @amitが指摘するように、capabilities.php
の関数宣言が2番目のパラメータを定義していないのは奇妙ですが。それがなぜであるかを誰かがはっきりさせることができるかもしれません。
ユーザーが他の作者の投稿を削除できるかどうかを確認したい場合は、適切な機能 - delete_others_posts
を使用する必要があります。
編集 -
他の関数があります author_can() 投稿IDを受け付けます。
current_user_can()
関数は 1つのパラメータ しか受け付けません。ポストIDを渡すことはできません。
パラメーター -
$capability (string) (required) capability Default: None
これがあなたが探しているものを達成するための最良の方法ではないかもしれません -
以下のコードで推測すると、ifブロックは現在のユーザーがその投稿のauthor
であり、能力を持っている場合にのみ実行されます - delete_posts
<?php
$current_user = wp_get_current_user();
$author = get_the_author_meta('ID');
if ( current_user_can('delete_posts') && ( $current_user->ID == $author ) ) {
// when current user is author with `delete_posts` capability
}
?>
ユーザーが自分の投稿を削除できるようにしますが、他の投稿の削除は許可しません。
削除が投稿の作成者に基づいている場合、管理者は特権を持っていても投稿を削除することはできません。
If文をこのように変更してください -
if ( current_user_can('activate_plugins') || ( $current_user->ID == $author ) )
{
// when current user is author or admin
}