web-dev-qa-db-de.com

Beitrag von der Startseite löschen (mit Wp-Administrator-Einschränkung)

ich benutze diese Funktion, um Beiträge von vorne zu löschen

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

es funktioniert zu 100%, aber ich benutze die Funktion, um zu verhindern, dass ein Administrator auf wp-admin zugreift.

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

mein Problem , wie kann ich dem Benutzer (nicht dem Administrator) erlauben, seinen eigenen Beitrag zu löschen?

4
Tayssir Ch

Wenn Sie möchten, dass Benutzer nur seinen eigenen Beitrag löschen können, dann ist es wichtig, dass Sie die ID des Benutzers und die Autoren-ID des Beitrags überprüfen. Das folgende Quellcode-Beispiel fügt der Admin-Leiste eine Schaltfläche "Papierkorb" hinzu, mit der die Benutzer ihren eigenen Beitrag problemlos löschen können.

Der Schlüssel ist die Funktion get_queried_object(). Dieses Objekt speichert alle Werte im Beitrag im Frontend und Sie können die Benutzer-ID überprüfen, dort ist angemeldet - get_current_user_id(). Wichtig für einen strengen Vergleich ist auch, dass Sie alle Werte auf den gleichen Typ setzen, wie zB Integer.

Es ist auch möglich, die WP Kernfunktion current_user_can() mit dem zweiten Parameter zu verwenden, um die Rechte für jeden Beitrag zu identifizieren: current_user_can('edit_post', 123) Dies überprüft die Fähigkeit des Beitrags mit der ID 123. Vielleicht ein bisschen einfacher bieten als die Prüfung über das Autorenobjekt und das Beitragsobjekt.

Auch nützlich in meinem Beispiel, dass Sie nicht den globalen $post verwenden müssen.

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

Für den Nichtzugriff auf den Admin-Bereich von Nicht-Admin ist es einfacher, eine kleine Funktion zu schreiben, die ein Umschreiben und keinen harten Würfel enthält. Verwenden Sie die WordPress-Funktion wp_redirect(), um eine bestimmte URL oder ein bestimmtes Frontend neu zu schreiben.

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

Die Lösung hierfür besteht darin, die Funktion zum Einschränken der Administration zu ändern, um bestimmten Umständen Rechnung zu tragen.

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

Wie wäre es, die Rolle des Benutzers als Autor zu ändern? Auf diese Weise verfügt der Benutzer über die Funktion edit_post, jedoch nur für den Beitrag, den er erstellt hat, und nicht für den Beitrag eines anderen.

1
Yamu

Wenn Sie eine differenzierte Berechtigungsprüfung benötigen, können Sie das Ergebnis user_has_cap filtern. WordPress ruft diese Funktion immer dann auf, wenn es nach Berechtigungen sucht.

Du benutzt es so:

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

Wenn ein Beitrag gelöscht wird, wird $ args auf array gesetzt ('delete_post', $ user_id, $ post_id). Die Funktionen, die zum Löschen erforderlich sind, sind im Array $ caps gespeichert und variieren je nach Art des zu löschenden Posts (z. B. "delete_published_posts"). Jede Fähigkeit in $ caps entspricht einem Gegenstand in $ allcaps. Um zu verhindern, dass der Beitrag gelöscht wird, müssen wir nur $ allcaps ändern, indem wir einen der in $ caps aufgeführten Werte auf false setzen (z. B. $ allcaps [$ caps [0]] = false).

0
Mark Barnes

Sie können die Funktion delete_published_posts und delete_published_pages verwenden, um die Funktion bereitzustellen. Diese Funktion ist standardmäßig für Author und höher verfügbar. Dies bedeutet, ob der Benutzer seinen veröffentlichten Beitrag löschen kann (da Sie den Beitrag vom Front-End löschen, muss er veröffentlicht werden).

Sie können es so überprüfen.

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

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