So deaktivieren Sie das Löschen von Seiten

7

Mein Kunde ist keine Computerperson. Ich habe eine Website für ihn erstellt. Es gibt einige wichtige Seiten. Mein Kunde löscht diese Seite immer. Dann möchte ich den Code (die Seiten-ID) neu konfigurieren.

Wie deaktiviere ich Löschoptionen für bestimmte Seiten?

PS: Möglicherweise kann er diese Seite bearbeiten. Nicht löschen.

user8917
quelle

Antworten:

10

Sie können die Funktionen und die Rolle entfernen delete_pages, der der Benutzer zugewiesen ist. Dadurch wird verhindert, dass die gesamte Benutzerrolle Seiten löscht.delete_others_pagesdelete_published_pages

Um dieses Verhalten nur auf einen Benutzer zu beschränken, müssen Sie eine dedizierte neue Rolle erstellen und dem Benutzer zuweisen. Weitere Informationen finden Sie im Mitglieder- Plugin von Justin Tadlock.

Beispiel: Entfernen Sie die Möglichkeit, Seiten aus der Administratorrolle zu löschen

$role = get_role('administrator');
$role->remove_cap('delete_pages');
$role->remove_cap('delete_others_pages');
$role->remove_cap('delete_published_pages');

Mehr Ressourcen

Rofflox
quelle
Roman Wünsche Danke für die Antwort, aber ich möchte diese Rolle NUR für bestimmte Seiten verwenden. Gibt es irgendwelche Lösungen? Er ist der einzige Administrator auf dieser Website
user8917
5

Brian Fegters Antwort ist fast perfekt.

In meinen Tests funktioniert seine Antwort nur, wenn Sie die Aktionen in "wp_trash_post" und "before_delete_post" ändern.

function restrict_post_deletion($post_ID){
    $user = get_current_user_id();
    $restricted_users = array(21,25,54,2,19);
    $restricted_pages = array(2,21,52,64);
    if(in_array($user, $restricted_users) && in_array($post_ID, $restricted_pages)){
        echo "You are not authorized to delete this page.";
        exit;
    }
}
add_action('wp_trash_post', 'restrict_post_deletion', 10, 1);
add_action('before_delete_post', 'restrict_post_deletion', 10, 1);
Playforward
quelle
3

Sie können eine Aktion erstellen, um Benutzer daran zu hindern, Beiträge wie folgt in den Papierkorb zu werfen oder zu löschen. Es ist nicht das schönste, aber es funktioniert. Sie müssen die Benutzer- und Seiten-IDs manuell ausfüllen.

function restrict_post_deletion($post_ID){
    $user = get_current_user_id();
    $restricted_users = array(21,25,54,2,19);
    $restricted_pages = array(2,21,52,64);
    if(in_array($user, $restricted_users) && in_array($post_ID, $restricted_pages)){
        echo "You are not authorized to delete this page.";
        exit;
    }
}
add_action('trash_post', 'restrict_post_deletion', 10, 1);
add_action('delete_post', 'restrict_post_deletion', 10, 1);
Brian Fegter
quelle
Brian Fegter, Danke für die Antwort. Ich habe den Code in function.php eingefügt. Aber wie kann ich die Seiten-ID übergeben?
user8917
Die Seiten-ID ist im Codebeispiel als $ post_ID definiert.
Brian Fegter
Mein Codebeispiel vergleicht die aktuelle Seiten- / Beitrags-ID mit der Variablen beschränkter Seiten. Außerdem wird überprüft, ob der aktuelle Benutzer die Variable "defined_users" überprüft. Damit dies funktioniert, müssen Sie $ eingeschränkte_Benutzer und $ eingeschränkte_Seiten manuell hinzufügen.
Brian Fegter
@BrianFegter In WP 3.3.2 funktioniert dies nicht. Hat sich etwas geändert? Ich habe eingeschränkte_Benutzer und eingeschränkte_Seiten so geändert, dass sie meiner Seite und meinem Benutzer entsprechen.
INT
1
@INT versuche stattdessen wp_trash_post. Ref: adambrown.info/p/wp_hooks/hook/trash_post
adrian7
0

Hier ist ein Beispiel, das ich getestet und gefunden habe, um zu verhindern, dass ein bestimmter Beitrag oder eine bestimmte Seite anhand ihrer ID gelöscht wird. Es sollte für alle WordPress-Benutzer funktionieren:

add_action('wp_trash_post', 'prevent_post_deletion');
function prevent_post_deletion($postid){
    $protected_post_id = 67586;
    if ($postid == $protected_post_id) {
        exit('The page you were trying to delete is protected.');
    }
}
Shahar Dekel
quelle
1
Dies wird ausgeführt, bevor versucht wird, einen Beitrag in den Papierkorb zu werfen und nicht zu löschen. Soweit ich weiß, gibt es auch dafür eine andere Aktion.
Shahar Dekel
0

Sie können die Papierkorb-Links sehr einfach sowohl in der Schnellbearbeitung als auch in der Meta-Box ausblenden. Führen Sie einen mit Stilen und den anderen mit dem Filter post_row_actions aus (möglicherweise können Sie beide mit dem Filter ausführen - keine Ahnung). Https://developer.wordpress.org/reference/hooks/post_row_actions/

//hide meta with styles
function hide_publishing_actions()
{
    global $post;
    if ($post_id == 21)
    {
        if (!current_user_can('administrator'))
        {
            // stuff here for non-admins
            echo '<style type="text/css">#delete-action</style>';
        }
    }
}

add_action('admin_head-post.php', 'hide_publishing_actions');
add_action('admin_head-post-new.php', 'hide_publishing_actions');

//for quick edit
add_filter('post_row_actions', 'remove_row_actions', 10, 1);
function remove_row_actions($actions)
{
    if (!current_user_can('administrator'))
    {
        if ($post_id == 21)
        unset($actions['edit']);
        unset($actions['view']);
        unset($actions['trash']);
        unset($actions['inline hide-if-no-js']);
    }
    return $actions;
}
DropHit
quelle
0

Sie können auch den Filter page_row_actions (siehe https://developer.wordpress.org/reference/hooks/page_row_actions/ ) verwenden, der für jede Seite in der Seitenlistentabelle aufgerufen wird.

Sie müssen die ID des Beitrags überprüfen, den Sie nicht bearbeiten oder löschen möchten. Sie können das Aktionsarray für diese Seiten ändern. Wenn Sie ein leeres Array zurückgeben, wird die Seite weiterhin in der Seitenlistentabelle aufgeführt, es gibt jedoch keine Links zum Bearbeiten, Löschen usw. Daher konnte die Seite nicht bearbeitet oder gelöscht werden.

Ihre Funktion sollte folgendermaßen aussehen (Hinweis: In meinem Beispielcode hat nur der Site-Administrator das Recht, die spezielle Seite zu ändern):

function custom_filter_page_row_actions($actions,$post){
  $page_to_exclude = get_page_by_path(Slug of the page you want to exclude);
  $site_admin_email = get_option('admin_email'); // Get the email of the site admin
  $site_admin =  get_user_by('email',$site_admin_email); // Get WP_User-instance of the site admin
  if(($post == $page_to_exclude) && ($site_admin != wp_get_current_user())){
    $actions = array(); //remove all actions
  }
  return $actions;
}
add_filter('page_row_actions','custom_filter_page_row_actions',999999,2); //Use a high number for this filter so that it is called after all plugins e.g. WPBakery Pagebuilder has add there actions
Alexander Behling
quelle