从首页删除帖子(带有WP-ADMIN限制)

时间:2013-11-05 作者:Tayssir Ch

am使用此功能从前面删除帖子

// Delete from Front-End Link

function wp_delete_post_link($link = \'Delete This\', $before = \'\', $after = \'\', $title="Move this item to the Trash", $cssClass="delete-post") {
    global $post;
    if ( $post->post_type == \'page\' ) {
        if ( !current_user_can( \'edit_page\' ) )
            return;
    } else {
        if ( !current_user_can( \'edit_post\' ) )
            return;
    }
    $delLink = wp_nonce_url( site_url() . "/wp-admin/post.php?action=trash&post=" . $post->ID, \'trash-\' . $post->post_type . \'_\' . $post->ID);
    $link = \'<a class="\' . $cssClass . \'" href="\' . $delLink . \'" onclick="javascript:if(!confirm(\\\'Are you sure you want to move this item to trash?\\\')) return false;" title="\'.$title.\'" />\'.$link."</a>";
    return $before . $link . $after;
}
其工作效率为100%,但我使用此功能限制任何管理员访问wp admin,使用此功能:

function restrict_admin(){
//if not administrator, kill WordPress execution and provide a message
    if ( ! current_user_can( \'create_users\' ) ) {
        wp_die( __(\'You are not allowed to access this part of the site\') );
    }
}
add_action( \'admin_init\', \'restrict_admin\', 1 );
my problem , 如何允许用户(非管理员)删除自己的帖子?

5 个回复
SO网友:bueltge

如果您愿意,用户只能删除自己的帖子,那么检查该帖子的用户ID和作者ID是很重要的。下面的源代码示例在管理栏中添加一个垃圾桶按钮,用户可以轻松删除自己的帖子。

关键是功能get_queried_object(). 此对象将所有值存储到前端的post中,您可以检查用户id,有登录-get_current_user_id(). 对于严格比较来说,同样重要的是,将所有值设置为同一类型,如整数。

也可以使用WP核心功能current_user_can() 使用第二个参数标识每个帖子的权限:current_user_can(\'edit_post\', 123) 这将检查具有ID的post的能力123. 可能会更容易一些,因为检查了author对象和post对象。

在我的示例中,您必须使用全局$post.

add_action( \'admin_bar_menu\', \'fb_add_admin_bar_trash_menu\', 35 );
function fb_add_admin_bar_trash_menu() {

  if ( ! is_super_admin() || ! is_admin_bar_showing() )
      return;

  $current_object = get_queried_object();

  // check, is the objekt with the value readable
  if ( ! isset( $current_object->post_author ) )
      return;

  // check, if the user id the same as the author-id if the current post
  if ( (int) $current_object->post_author !== (int) get_current_user_id() )
      return;

  if ( empty( $current_object ) )
      return;

  if ( ! empty( $current_object->post_type ) && 
     ( $post_type_object = get_post_type_object( $current_object->post_type ) ) && 
     current_user_can( $post_type_object->cap->edit_post, $current_object->ID ) 
  ) {
    global $wp_admin_bar;

    $wp_admin_bar->add_menu( 
        array(
            \'id\'    => \'delete\', 
            \'title\' => __( \'Move to Trash\' ), 
            \'href\'  => get_delete_post_link( $current_object->term_id ) 
        ) 
    );
  }
}
对于非admin的非访问管理区域,编写一个包含重写的小函数更容易,而不是硬模。使用WordPress功能wp_redirect() 重写到特定url或前端。

add_action( \'admin_init\', \'fb_redirect_to_frontend\' );
function fb_redirect_to_frontend() {

    if ( ! current_user_can( \'remove_users\' ) )
        wp_redirect( site_url() );
}

SO网友:henrywright

解决方法是修改您的restrict admin功能以允许特定情况。

function restrict_admin() {

    // Bail if a user is trying to trash a post.
    if ( isset( $_GET[ \'action\'] ) && \'trash\' == $_GET[ \'action\'] )
        return;

    // Kill execution if not an administrator.
    if ( ! current_user_can( \'create_users\' ) )
        wp_die( __( \'You are not allowed to access this part of the site\' ) );
}
add_action( \'admin_init\', \'restrict_admin\', 1 );

SO网友:Yamu

如何更改用户作为作者的角色??这样,用户将具有edit\\u post功能,但只针对他们创建的帖子,而不针对其他人的帖子。

SO网友:sakibmoon

您可以使用该功能delete_published_postsdelete_published_pages 提供设施。此功能提供给Author 默认为向上。这意味着用户是否可以删除其发布的帖子(因为您是从前端删除帖子,所以它必须是发布的帖子)。

你可以这样检查。

if (!current_user_can(\'delete_published_posts\') {
    return;
}

if (!current_user_can(\'delete_published_pages\') {
    return;
}

SO网友:Mark Barnes

如果需要进行非常细粒度的权限检查,可以过滤user_has_cap 后果WordPress在检查权限时调用该函数。

您可以这样使用它:

add_filter (\'user_has_cap\', \'your_function\', 10, 3);

function your_function ($allcaps, $caps, $args) {
    if ($allow_this_action == true)
        return $allcaps;
    elseif ($allow_this_action == false) {
        $allcaps[$caps[0]] = false;
        return $allcaps;
    }
}
删除帖子时,$args设置为array(\'delete\\u post\',$user\\u id,$post\\u id)。允许删除所需的功能存储在数组$caps中,并根据要删除的帖子类型(例如“delete\\u published\\u posts”)而有所不同。$caps中的每个功能对应于$allcaps中的一个项目。为了防止帖子被删除,我们需要做的就是修改$allcaps,方法是将$caps中列出的一个值设置为false(例如,$allcaps[$caps[0]]=false)。

结束