web-dev-qa-db-ja.com

特定のユーザーロールに対するダッシュボードアクセスを特定の操作に制限する

私はget_delete_post_link()を使って自分の投稿を削除するためにログインしたユーザー(ロールAuthor)を可能にするスクリプトを持っています。ただし、著者のダッシュボードへのアクセスも制限できるようにしたいと思います。プラグイン(Theme my Loginなど)や以下にリンクされているような単純なスクリプトを使用しようとすると、get_delete_post_link()を使用できなくなります。 get_delete_post_link()による投稿の削除を許可しながら、 "作成者"ユーザーロールのダッシュボードへのアクセスを制限する方法はありますか?

http://www.tutorialstag.com/restrict-wordpress-dashboard-access.html

ダッシュボードへのアクセスを管理者だけに制限するにはどうすればいいですか?

2
laurayeffeth

これで私はこの問題を解決したのです。もともと私は個々の投稿を削除するためのリンクにこのコードを使用しました:

<?php if( !(get_post_status() == 'trash') ) : ?>
<a class="delete-post" onclick="return confirm('Are you sure you wish to delete post: <?php echo get_the_title() ?>?')"href="<?php echo get_delete_post_link( get_the_ID() ); ?>">Delete</a>
<?php endif; ?>

ユーザーがログインしているかどうか、およびユーザーがこの投稿の作者であるかどうかを確認した後。私の最初の投稿で述べたようにこれはうまくいきませんでした。

その代わりに、単純な削除ボタンを使用しました(上記と同じチェックが付いています)。

<form class="delete-post" action="<?php bloginfo('url'); ?>/edit-post" method="post"> 
    <input id="post_id" type="hidden" name="postid" value="<?php the_ID(); ?>" /> 
    <input type="submit" value="Delete" />
</form>

このjQueryスクリプトは、私のphpスクリプトを実行するajax呼び出しを行います。

jQuery(document).ready(function($){  
    $('.delete-post').bind('click', function(e){

        e.preventDefault();

        var post_id;
        post_id = $("#post_id").val();
        var data = {};
        var obj = {data: data}; 
        data['post_id'] = post_id;

        alert('Are you sure you wish to delete this post?');
        process_delete_post();

        function process_delete_post() {
            jQuery.ajax({
                type: "POST",
                url: run_delete_post.ajaxurl,
                data: ({
                    post_id : data['post_id'],
                    action : 'run_delete_post_script',
                }),
                success: function() {
                     location.href = "";
                },

                error: function(jqXHR, exception) {
                    if (jqXHR.status === 0) {
                        alert('Not connect.\n Verify Network.');
                    } else if (jqXHR.status == 404) {
                        alert('Requested page not found. [404]');
                    } else if (jqXHR.status == 500) {
                        alert('Internal Server Error [500].');
                    } else if (exception === 'parsererror') {
                        alert('Requested JSON parse failed.');
                    } else if (exception === 'timeout') {
                        alert('Time out error.');
                    } else if (exception === 'abort') {
                        alert('Ajax request aborted.');
                    } else {
                        alert('Uncaught Error.\n' + jqXHR.responseText);
                    }
                }

            });
        }   

    }); 

}); 

私のfunctions.phpファイルで、私は私のajax呼び出しを設定しました:

function mytheme_delete_post() {
    if ( is_page_template( 'edit-delete-posts.php' ) ) {
        wp_enqueue_script( 'process-delete-post', get_template_directory_uri().'/js/process-delete-post.js', array('jquery'), true);
        wp_localize_script( 'process-delete-post', 'run_delete_post', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
        }
}
add_action('template_redirect', 'mytheme_delete_post');

$dirName = dirname(__FILE__);
$baseName = basename(realpath($dirName));
require_once ("$dirName/functions_custom.php");

add_action("wp_ajax_run_delete_post_script", "run_delete_post_script");     

それから、私のfunctions_custom.phpファイルの投稿を削除するための実際のphpスクリプト:

function run_delete_post_script() {
    // Test for current user
    mytheme_get_current_user();

    //Get the data from the submit page and convert to php variables
    foreach ($_POST as $field => $value) {
        if (isset($_POST[$field])) {
            $$field = $value;
        }
    }
    wp_delete_post( $post_id );
}
1
laurayeffeth

作成者がダッシュボードを表示しようとしたときのターゲットリダイレクトはどうですか。

function restrict_dashboard_access() {
    //Leave AJAX requests alone - their life is hard enough without further scrutany
    if( $_SERVER['PHP_SELF'] == '/wp-admin/admin-ajax.php' )
        return;

    if( $_SERVER['PHP_SELF'] == '/wp-admin/post.php' && isset( $_REQUEST['action'] ) ) {
        switch( $_REQUEST['action'] ) {
            case 'trash': //Leave alone requests to delete posts,
            case 'delete'://such as those generated by get_delete_post_link()
                return;
        }
    }

    //For all other admin requests,

    //redirect users of the 'author' role to the home_url
    $user = get_userdata( get_current_user_id() );
    if( in_array( 'author', $user->roles ) ) {
        wp_redirect( home_url() );
        exit;  //Force script death to avoid useless script execution post-redirect
    }
}
add_action( 'admin_init', 'restrict_dashboard_access', 1 );

(リンクされたリソースとadmin_initアクションの WP Codexページからハッキングされています

編集:コメントに記載されている追加情報に照らして、削除後のリダイレクトを特定のURLに実装する方法。

function restrict_dashboard_access() {
    //Leave AJAX requests alone - their life is hard enough without further scrutany
    if( $_SERVER['PHP_SELF'] == '/wp-admin/admin-ajax.php' )
        return;

    if( $_SERVER['PHP_SELF'] == '/wp-admin/post.php' && isset( $_REQUEST['action'] ) ) {
        switch( $_REQUEST['action'] ) {
            case 'trash': //Leave alone requests to delete posts,
            case 'delete'://such as those generated by get_delete_post_link()
                return;
        }
    }

    //For all other admin requests, redirect users of the 'author' role
    $user = get_userdata( get_current_user_id() );
    if( in_array( 'author', $user->roles ) ) {

        if( $_SERVER['PHP_SELF'] == '/wp-admin/edit.php' && ( isset( $_REQUEST['trashed'] ) || isset( $_REQUEST['deleted'] ) ) ) {
            // If an Author has just deleted a post - redirect them to a specific URL.
            wp_redirect( home_url() . '/post-deleted-page' );
        } else {
            // If an Author is viewing any other admin page, drop them back to the homepage
            wp_redirect( home_url() );
        }

        exit;  //Force script death to avoid useless script execution post-redirect
    }
}
add_action( 'admin_init', 'restrict_dashboard_access', 1 );
0
bosco