it-swarm.com.de

Verhindern Sie den Papierkorb-/Löschvorgang für bestimmte Beitragstypen

Bearbeiten:

In einem Plugin, das ich entwickle, muss ich Zahlungen, IPN und Transaktionen für Kunden sowohl im Frontend als auch im Backend speichern. Ich bin jedoch besorgt, dass der Administrator seine Handlungsbefugnis dazu nutzt, die Transaktionen oder Finanzdaten von der Website zu löschen, was schlimme Auswirkungen hat.

Frage

Wie kann ich verhindern, dass der Administrator Zahlungen/Finanzdaten auf eine Weise löscht, die sicherstellt, dass ich nicht versuche, Administratoren zu stark einzuschränken, sondern dass Kundeninformationen und Finanzdaten eine hohe Priorität haben. Ich frage nicht, wie ich es besser machen kann. Ich frage mich aber lieber, was der bessere Weg für die WordPress-Community ist (als Administration, als Kunde), da ich versuche, zukünftige Beschwerden über die Art und Weise, wie diese Aktion implementiert wird, zu vermeiden.

Was ich derzeit habe

/**
 * Constructor
 */
public function __construct() {

    // Do not allow payments and transactions to be trashed
    add_action( 'wp_trash_post',                            array( $this, 'disable_trash' ) );
    add_action( 'before_delete_post',                       array( $this, 'disable_trash' ) );
}

/**
 * Disable trash
 */
public function disable_trash( $post_id ) {
    global $post_type;

    if ( in_array( $post_type, array( 'payment', 'transaction' ) ) ) {
        wp_die( __( 'You are not allowed to trash payments or transactions.', 'xxx' ) );
    }
}
5
Ahmed Fouad

Hier ist ein weiterer Ansatz, der den map_meta_cap-Filter verwendet, der innerhalb der map_meta_cap() -Funktion innerhalb der has_cap() -Methode der WP_User -Klasse angewendet wird ( PHP 5.4+ ):

add_filter( 'map_meta_cap', function ( $caps, $cap, $user_id, $args )
{
    // Nothing to do
    if( 'delete_post' !== $cap || empty( $args[0] ) )
        return $caps;

    // Target the payment and transaction post types
    if( in_array( get_post_type( $args[0] ), [ 'payment', 'transaction' ], true ) )
        $caps[] = 'do_not_allow';       

    return $caps;    
}, 10, 4 );

dabei zielen wir auf die Funktion delete_post meta und die benutzerdefinierten Beitragstypen payment und transaction ab.

Soweit ich die Funktion get_post_type_capabilities() verstehe und durchblättere, muss das Argument map_meta_cap in den Einstellungen für register_post_type nicht auf true gesetzt werden, um die Metafunktion delete_post auszurichten.

ps: Hier sind einige gute Beschreibungen des map_meta_cap-Filters und hilfreiche Beispiele von Justin Tadlock hier und Toscho hier.Hier habe ich ein altes Beispiel gefunden, das ich vergessen hatte und das wir auch anpassen konnten, um Papierkorb/Löschen auf bestimmten Seiten und Benutzerrollen zu vermeiden. Hier ist eine Antwort von TheDeadMedic, die auf eine Antwort von Seamus Leahy bezüglich des register_post_type-Ansatzes verweist. Hier sind einige weitere Beispiele auf dieser Website. Ich hoffe es hilft!

9
birgire

Eine bessere Möglichkeit, das Löschen zu verhindern, besteht darin, die Option Capability für alle Rollen zu deaktivieren. Wenn Sie Ihre Beitragsarten registrieren "Zahlung" und "Transaktion" definieren Sie auch einen capability_type mit dem gleichen Namen wie Ihre Beitragsart. Dadurch erhalten Sie die Funktionen read_payment, edit_payment und delete_payment (wie bei der Transaktion).

Sie können diese Funktion dann auf folgende Weise für Rollen verweigern:

$wp_roles->remove_cap( 'editor', 'delete_payment' );
$wp_roles->remove_cap( 'admin', 'delete_payment' );

Beachten Sie immer, dass Administratoren, die Code auf Ihrer Site bearbeiten können, die Löschung dennoch umgehen können, es sei denn, Sie blockieren die Codebearbeitung im Backend und schränken den FTP- und Datenbankzugriff ein. Lesen Sie auch diese Diskussion zum Abrufen aller verfügbaren Rollen.

5
cjbj

Ich habe diesen Code auf einer Website verwendet, auf der wir die Schaltflächen zum Bearbeiten, Löschen und Anzeigen ausblenden können.

if(!current_user_can('administrator')) //not an admin
{
    add_filter( 'post_row_actions', 'remove_row_actions', 10, 1 );
    function remove_row_actions( $actions )
    {
        if( get_post_type() === 'post' ) {
            unset( $actions['edit'] );
            unset( $actions['view'] );
            unset( $actions['trash'] );
            unset( $actions['inline hide-if-no-js'] );
        }
        return $actions;
    }
}

if(!current_user_can('administrator'))//not and admin
{
    global $pagenow;
    if ( 'post.php' == $pagenow || 'post-new.php' == $pagenow ) {
        add_action( 'admin_head', 'wpse_125800_custom_publish_box' );
        function wpse_125800_custom_publish_box() {
            $style = '';
            $style .= '<style type="text/css">';
            $style .= '#delete-action, .bulkactions';
            $style .= '{display: none; }';
            $style .= '</style>';

            echo $style;
        }
    }
}
0
Venkatesh Munna