允许角色删除帖子,但阻止其wp-admin

时间:2017-06-01 作者:Relisora

我有一个自定义用户角色:照片。

此角色不能登录到后台,但必须能够从前端删除自己的帖子。

我使用此代码阻止所有非管理员用户通过以下(function.php)连接到backoffice:

add_action( \'init\', \'blockusers_init\' );
function blockusers_init() {
    if ( is_admin() && ! current_user_can( \'administrator\' ) &&
         ! ( defined( \'DOING_AJAX\' ) && DOING_AJAX ) ) {
        wp_redirect( home_url() );
        exit;
    }
}
我正在使用此代码删除帖子(portfolio.php):

<a href="<?php echo get_delete_post_link( $post->ID ) ?>">Delete post</a>
我尝试了其他几种选择,但从来都不能只允许摄影师删除他们的帖子(或全球帖子,因为他们无论如何都只能看到自己的帖子)

非常感谢。

3 个回复
最合适的回答,由SO网友:hwl 整理而成

假设您正在谈论一个自定义用户role 名为“摄影师”,我相信这样的东西应该会增加delete_posts 该角色的能力。

function add_delete_cap_to_photog_role() {
    $role = get_role( \'photographer\' );

    $role->add_cap( \'delete_posts\' );
}
add_action( \'admin_init\', \'add_delete_cap_to_photog_role\');
为角色添加上限后,要解决其余问题,您可以

保持blockusers_init 和沟渠get_delete_post_link 对于ajax删除blockusers_init 函数并执行条件重定向我会对每一个都给出一些想法。我喜欢开沟get_delete_post_link 在这种情况下。

Several steps below, so be aware the code is provided as a guide only. Rewrite and rename things as needed.

沟渠get_delete_post_link AJAX删除替换get_delete_post_link 用这样的方式排队:

<?php if( current_user_can( \'delete_post\' ) ) : ?>
    <a href="#" data-id="<?php the_ID() ?>" data-nonce="<?php echo wp_create_nonce(\'ajax_delete_post_nonce\') ?>" class="delete-post">delete</a>
<?php endif ?>
Enqueue some JS

在文件中:函数。php

function delete_post_ajax() {
    wp_enqueue_script(  \'delete_ajax\', get_template_directory_uri() . \'/js/my_script.js\', array( \'jquery\' ), \'1.0.0\', true );
    wp_localize_script( \'delete_ajax\', \'TheAjax\', array( \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) ) );
}

add_action( \'wp_enqueue_scripts\', \'delete_post_ajax\' );

onClick to pass data to delete method

在文件:/js/my\\u脚本中。js公司

jQuery( document ).ready( function($) {
    $(document).on( \'click\', \'.delete-post\', function() {
        var id = $(this).data(\'id\');
        var nonce = $(this).data(\'nonce\');
        var post = $(this).parents(\'.post:first\');
        $.ajax({
            type: \'post\',
            url: TheAjax.ajaxurl,
            data: {
                action: \'wpse_ajax_delete_post\',
                nonce: nonce,
                id: id
            },
            success: function( result ) {
                if( result == \'success\' ) {
                    post.fadeOut( function(){
                        post.remove();
                    });
                }
            }
        })
        return false;
    })
})

the delete method

文件中:函数。php(我们需要的钩子只是“wp_ajax“在action 在js文件中)

add_action( \'wp_ajax_wpse_ajax_delete_post\', \'wpse_ajax_delete_post_func\' );
function wpse_ajax_delete_post_func(){

    $permission = check_ajax_referer( \'ajax_delete_post_nonce\', \'nonce\', false );
    if( $permission == false ) {
        echo \'error\';
    }
    else {
        wp_delete_post( $_REQUEST[\'id\'] );
        echo \'success\';
    }

    die();

}
要通过传递uri参数执行上述操作:

更改我们调出的位置get_delete_posts_link 为此:

<?php if( current_user_can( \'delete_post\' ) ) : ?>
    <?php $nonce = wp_create_nonce(\'ajax_delete_post_nonce\') ?>
    <a href="<?php echo admin_url( \'admin-ajax.php?action=wpse_ajax_delete_post&id=\' . get_the_ID() . \'&nonce=\' . $nonce ) ?>" data-id="<?php the_ID() ?>" data-nonce="<?php echo $nonce ?>" class="delete-post">delete</a>
<?php endif ?>
查看此a more involved walkthrough explaining each step

沟渠blockusers_init (又名条件重定向)如果用户没有manage_options cap,这是一个管理员角色。但首先,它会使用一些css伪隐藏内容并向用户添加消息:

The CSS bit

在文件中:函数。php

add_action(\'admin_head\', \'hide_admin_via_css\');
function hide_admin_via_css() {
    if (!current_user_can( \'manage_options\' )) {
        echo \'<style>body * {visibility:hidden !important;} body:before {content:"Give it a second...";}
\';
    }
}

Enqueueing the JS file

在文件中:函数。php

function my_enqueue( $hook ) {
    if (!current_user_can( \'manage_options\' )) {
        wp_enqueue_script( \'my_custom_script\', get_template_directory_uri() \'/js/block-admin.js\' );
    }
}
add_action(\'admin_enqueue_scripts\', \'my_enqueue\');

Set the JS to just immediately redirect

文件:theme\\u root/js/block admin。js公司

window.location.href = "/";

OR a timed redirect

setTimeout(function () {
   window.location.href = "/";
}, 2000);
这种方法came from clicknathan, and he offers more details here.

SO网友:socki03

hwl的回答是正确的,但我将添加一个检查,以确定当前用户是否是该帖子的作者。

<?php
$current_user = wp_get_current_user();
if ( $current_user->ID == $post->post_author ) { ?>
    <a href="<?php echo get_delete_post_link( $post->ID ) ?>">Delete post</a>
<?php } ?>
,因为您可能会添加\'delete_posts\', 这可能会删除任何帖子,这可能是一种保护措施<;那是不对的。

这样,链接只会出现在他们可以删除的帖子上,即他们自己的帖子上。

SO网友:Nathan Johnson

您的问题有三个要求:

角色应该不能登录到后端。角色应该能够删除自己的帖子。一个隐含的要求是,他们应该能够删除已发布的帖子。假设您有一种方法,用户可以在不访问后端的情况下发布帖子。如果是,则可以通过以下方式操纵角色:

卸下read 功能添加delete_posts 功能添加delete_published_posts 由于该角色没有delete_others_posts, 然后他们将无法删除其他用户的帖子,即使这些帖子已经发布。

角色功能存储在数据库中,因此您应该在插件或主题激活时添加和删除它们。下面是一个示例插件,它在激活时添加所需的功能,在停用时删除这些功能。

/**
 * Plugin Name: WordPress StackExchange Question 268755
 * Description: Allow subscribers to delete their own posts
 **/

//* On activation, add the capabilities to the subscriber role
register_activation_hook( __FILE__, \'wpse_268755_activation\' );
function wpse_268755_activation() {
  $photograph = get_role( \'photograph\' );
  $photograph->remove_cap( \'read\' );
  $photograph->add_cap( \'delete_posts\' );
  $photograph->add_cap( \'delete_published_posts\' );
}

//* On deactivation, remove the capabilities from the subscriber role
register_deactivation_hook( __FILE__, \'wpse_268755_deactivation\' );
function wpse_268755_deactivation() {
  $photograph = get_role( \'photograph\' );
  $photograph->remove_cap( \'delete_posts\' );
  $photograph->remove_cap( \'delete_published_posts\' );
}
然后,您需要一种实际删除帖子的方法。如果用户可以访问后端,则可以使用get_delete_post_link.

<a href="<?php echo get_delete_post_link( $post->ID ) ?>">Delete post</a>
因此,您需要编写一些javascript,当单击该链接时,它会阻止默认行为并发送AJAX 请求删除帖子。

结束

相关推荐

WordPress网络(多站点)/wp-admin/重定向循环(ERR_TOO_MANY_REDIRECTS)

我有一个Wordpress网络,在那里我运行+/-10个站点。最近,我在访问其中一个站点的wp admin页面时出现重定向错误。网络中的所有站点都工作正常,我也可以访问他们的管理员,除了一个站点之外,没有任何问题。我收到错误:ERR\\u TOO\\u MANY\\u重定向以下是我所做的:清理浏览器、服务器和云中的所有COOKIE清理缓存重命名htaccess重命名插件文件夹重命名主题文件夹添加定义(\'COOKIE\\u DOMAIN\',false);对于wp config,这个站点的配置与其他站点完