it-swarm.com.de

Erlaube der Rolle, Beiträge zu löschen, aber blockiere ihm den wp-admin

Ich habe eine benutzerdefinierte Benutzerrolle: Foto.

Diese Rolle sollte nicht in der Lage sein, sich im Backoffice anzumelden, sondern ihre eigenen Posts im Frontend löschen können.

Ich verwende diesen Code, um zu verhindern, dass alle Benutzer ohne Administratorrechte eine Verbindung zum Backoffice herstellen (function.php):

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

Und ich benutze diesen Code, um Beiträge zu löschen (portfolio.php):

<a href="<?php echo get_delete_post_link( $post->ID ) ?>">Delete post</a>

Ich habe ein paar andere Optionen ausprobiert, aber ich war nie in der Lage, Fotografen zu erlauben, ihre Beiträge zu löschen (oder global zu posten, weil sie sowieso nur ihre sehen können)

Vielen Dank !

2
Relisora

Angenommen, Sie sprechen von einem benutzerdefinierten Benutzer role mit dem Namen "photographer". Ich glaube, dies sollte dieser Rolle die delete_posts-Funktion hinzufügen.

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

Nachdem Sie der Rolle die Kappen hinzugefügt haben, können Sie den Rest entweder lösen

  1. behalte blockusers_init und den get_delete_post_link für einen Ajax-Löschvorgang.
  2. deaktivieren Sie die Funktion blockusers_init und führen Sie eine bedingte Umleitung durch.

Ich werde einige Ideen zu jedem geben. Ich bevorzuge in diesem Fall das Abwerfen von get_delete_post_link.

Einige Schritte weiter unten. Beachten Sie daher, dass der Code nur als Richtlinie dient. Schreiben Sie die Dinge um und benennen Sie sie nach Bedarf um.


Graben get_delete_post_link aka AJAX Löschen

ersetzen Sie die Zeile get_delete_post_link durch Folgendes:

<?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 ?>

Einige JS in die Warteschlange stellen

in der Datei: functions.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, um Daten an die Löschmethode zu übergeben

in der Datei: /js/my_script.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;
    })
})

die Löschmethode

in der Datei: functions.php (der Haken, den wir brauchen, ist nur "wp_ajax" vor dem Namen der action in der js-Datei)

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

}

So führen Sie die oben genannten Schritte durch, indem Sie uri params übergeben:

Ändern Sie, wo wir get_delete_posts_link dafür ausgetauscht haben:

<?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 ?>

Siehe dies für eine ausführlichere Anleitung, die jeden Schritt erklärt


Ditch blockusers_init (auch als bedingte Weiterleitung bekannt)

Dies setzt eine Umleitung auf wp-admin, wenn der Benutzer keine manage_options-Obergrenze hat, was eine Administratorrolle ist. Aber zuerst versteckt es Dinge und fügt dem Benutzer eine Nachricht mit einigem CSS hinzu:

Das CSS-Bit

in der Datei: functions.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...";}
';
    }
}

Einreihen der JS-Datei

in der Datei: functions.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');

Setze das JS so, dass es sofort umleitet

datei: Themenstammverzeichnis/js/block-admin.js

window.location.href = "/";

OR eine zeitgesteuerte Weiterleitung

setTimeout(function () {
   window.location.href = "/";
}, 2000);

Dieser Ansatz kam von Clicknathan, und er bietet hier weitere Details.

3
hwl

die Antwort von hwl ist richtig, aber ich werde eine Überprüfung hinzufügen, ob der aktuelle Benutzer der Autor des Beitrags ist.

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

Da Sie möglicherweise 'delete_posts 'hinzufügen, wodurch alle Posts gelöscht werden könnten, ist dies möglicherweise ein Schutz. <Das war nicht richtig.

Auf diese Weise wird der Link nur für Beiträge angezeigt, die sie selbst löschen können.

1
socki03

Ihre Frage enthält drei Anforderungen:

  1. Die Rolle sollte sich nicht im Backend anmelden können
  2. Die Rolle sollte in der Lage sein, ihre eigenen Beiträge zu löschen
  3. Eine implizite Voraussetzung ist, dass sie veröffentlichte Beiträge löschen können

Vermutlich verfügen Sie über eine Methode, mit der der Benutzer seine Beiträge ohne Zugriff auf das Backend veröffentlichen und veröffentlichen kann. In diesem Fall können Sie die Rolle folgendermaßen bearbeiten:

  1. Entfernen der Funktion read
  2. Hinzufügen der delete_posts-Funktion
  3. Fügen Sie die Fähigkeit delete_published_posts hinzu

Da die Rolle keinen delete_others_posts hat, können sie die Beiträge anderer Benutzer nicht löschen - auch wenn sie veröffentlicht sind.

Rollenfunktionen werden in der Datenbank gespeichert, daher sollten Sie sie bei der Aktivierung des Plugins oder des Themas hinzufügen und entfernen. Hier ist ein Beispiel-Plugin, das die erforderlichen Funktionen beim Aktivieren hinzufügt und beim Deaktivieren entfernt.

/**
 * 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' );
}

Sie benötigen dann eine Möglichkeit, den Beitrag tatsächlich zu löschen. Wenn der Benutzer Zugriff auf das Back-End hatte, könnten Sie get_delete_post_link verwenden.

<a href="<?php echo get_delete_post_link( $post->ID ) ?>">Delete post</a>

Sie müssen also Javascript schreiben, das beim Klicken auf diesen Link das Standardverhalten verhindert und eine AJAX -Anforderung zum Löschen des Posts sendet.

1
Nathan Johnson