web-dev-qa-db-ja.com

フロントページから投稿を削除する(Wp-admin制限付き)

正面から投稿を削除するためにこの関数を使用しています

// 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 );

私の問題 、自分の投稿を自分の投稿を削除するにはどうすればいいですか?

4
Tayssir Ch

必要に応じて、そのユーザーは自分の投稿のみを削除できるので、ユーザーのIDと投稿のAuthor-IDを確認することが重要です。次のソースの例では、ユーザーが自分の投稿を簡単に削除できるように、管理バーにゴミ箱ボタンを追加します。

キーは関数get_queried_object()です。このオブジェクトはすべての値をフロントエンドの投稿に保存しており、ユーザーIDを確認できます。ログインしている-get_current_user_id()。厳密な比較では、整数などのすべての値を同じ型に設定することも重要です。

WPコア関数current_user_can()を2番目のパラメーターとともに使用して、各投稿に対する権限を識別することもできます。current_user_can('edit_post', 123)これにより、ID 123。作成者オブジェクトと投稿オブジェクトについてのチェックとして、少し入札が簡単かもしれません。

また、私の例では、グローバル$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 ) 
        ) 
    );
  }
}

非管理者の管理者領域への非アクセスは、ハードダイではなく、書き換えを含む小さな関数を記述する方が簡単です。 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() );
}
3
bueltge

これを解決するには、特定の状況に合わせて制限管理機能を変更します。

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 );
2
henrywright

作成者としてのユーザーの役割を変更するのはどうですか。こうすることで、ユーザーはedit_post機能を持つことになりますが、他の人の投稿用ではなく、作成した投稿用のみです。

1
Yamu

非常にきめの細かいパーミッションチェックが必要な場合は、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_post'、$ user_id、$ post_id)に設定されます。削除を許可するために必要な機能は配列$ capsに格納され、どのタイプの投稿が削除されているかによって異なります(例: 'delete_published_posts')。 $ capsの各機能は、$ allcapsの項目に対応しています。投稿が削除されないようにするには、$ capsにリストされている値の1つをfalseに設定して$ allcapsを変更するだけです(例:$ allcaps [$ caps [0]] = false)。

0
Mark Barnes

機能を提供するためにdelete_published_postsdelete_published_pagesの機能を使うことができます。この機能はデフォルトでAuthor以上に提供されています。これは、ユーザーが自分の公開された投稿を削除できるかどうかを意味します(フロントエンドから投稿を削除しているため、公開された投稿である必要があります)。

これで確認できます。

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

if (!current_user_can('delete_published_pages') {
    return;
}
0
sakibmoon