web-dev-qa-db-fra.com

Supprimer le message de la page d'accueil (avec restriction Wp-admin)

j'utilise cette fonction pour supprimer le message de l'avant

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

son travail 100% mais j'utilise la fonction pour restreindre aucun administrateur à accéder à wp-admin, en utilisant cette fonction:

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

mon problème , comment puis-je autoriser un utilisateur (pas un administrateur) à supprimer son message après son propre message?

4
Tayssir Ch

Si vous le souhaitez, seuls les utilisateurs peuvent supprimer leur propre message. Il est donc important de vérifier l'ID de l'utilisateur et l'identifiant de l'auteur du message. L'exemple de source suivante ajoute un bouton Corbeille à la barre d'administration pour que les utilisateurs puissent facilement supprimer leur propre message.

La clé est la fonction get_queried_object(). Cet objet a stocké toutes les valeurs de la publication sur le front-end et vous pouvez vérifier l'ID de l'utilisateur, il est connecté - get_current_user_id(). Il est également important, pour une comparaison stricte, de définir toutes les valeurs sur le même type, comme un entier.

Il est également possible d'utiliser la fonction principale WP current_user_can() avec le deuxième paramètre pour identifier les droits de chaque publication: current_user_can('edit_post', 123) this vérifie la capacité de la publication avec l'ID 123. Peut-être une petite enchère plus facile que la vérification de l'objet auteur et de l'objet post.

Également utile dans mon exemple, vous devez utiliser le $post global.

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

Pour le non accès à la zone admin de non admin, il est plus facile d'écrire une petite fonction incluant une réécriture, pas un dé. Utilisez la fonction wp_redirect() de WordPress pour réécrire dans une URL ou une interface spécifique.

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

La solution consiste à modifier votre fonction de restriction de l’administrateur pour tenir compte de certaines circonstances.

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

Que diriez-vous de changer le rôle de l'utilisateur en tant qu'auteur? Ce faisant, l'utilisateur disposera de la fonctionnalité edit_post, mais uniquement pour le message créé, pas pour le message des autres.

1
Yamu

Si vous avez besoin d'une vérification des autorisations très fine, vous pouvez filtrer le résultat user_has_cap. Les appels WordPress qui fonctionnent à chaque fois qu'il vérifie les autorisations.

Vous l'utilisez comme ceci:

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;
    }
}

Lorsqu'une publication est en cours de suppression, $ args est défini sur array ('delete_post', $ user_id, $ post_id). Les fonctionnalités requises pour autoriser la suppression sont stockées dans le tableau $ caps et varieront en fonction du type de publication en cours de suppression (par exemple, "delete_published_posts"). Chaque capacité dans $ caps correspond à un élément dans $ allcaps. Pour empêcher la suppression de la publication, il suffit de modifier $ allcaps en définissant une des valeurs répertoriées dans $ caps sur false (par exemple, $ allcaps [$ caps [0]] = false).

0
Mark Barnes

Vous pouvez utiliser les fonctionnalités delete_published_posts et delete_published_pages pour fournir le service. Cette capacité est fournie à Author et plus haut par défaut. Cela signifie si l'utilisateur peut supprimer sa publication publiée (car vous supprimez une publication du front-end, elle doit donc être publiée).

Vous pouvez le vérifier comme ça.

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

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