web-dev-qa-db-ja.com

ユーザーが特定の投稿を削除できるかどうかを確認します

私はこの問題に遭遇しました、そこでは以下のコードはそれに供給されるどんな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);

これが機能しない理由は何ですか?

1
John

これを機能させるための何時間もの戦いの後、それはdelete_postsdelete_postに変更することの問題でした。

したがって、全体としてこれは次のようになります。

current_user_can('delete_posts', $post_id);

current_user_can('delete_post', $post_id);

current_user_canは2番目のパラメーターを受け入れます。 @amitが指摘するように、capabilities.phpの関数宣言が2番目のパラメータを定義していないのは奇妙ですが。それがなぜであるかを誰かがはっきりさせることができるかもしれません。

3
John

ユーザーが他の作者の投稿を削除できるかどうかを確認したい場合は、適切な機能 - delete_others_postsを使用する必要があります。

1
Mamaduka

編集 -

他の関数があります 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
    }
0
amit