einen Poststatus ändern, wenn Nutzer Beiträge aktualisieren?

Gibt es eine effiziente Möglichkeit, einen Poststatus von “publiziert” in “Entwurf” zu ändern, wenn ein Benutzer eines bestimmten Typs versucht, seine Posts zu aktualisieren. Ich habe etwas in dieser Richtung versucht

function change_post_status($post_id) { if(current_user_can('rolename')) { $current_post = get_post( $post_id, 'ARRAY_A' ); $current_post['post_status'] = 'draft'; wp_update_post($current_post); } } add_action('pre_post_update','change_post_status'); 

Der Code sieht gut aus, aber aus irgendeinem Grund funktioniert es nicht richtig und ich denke, es schafft eine Endlosschleife (zwingt mich, meinen SQL-Server neu zu starten).

Solutions Collecting From Web of "einen Poststatus ändern, wenn Nutzer Beiträge aktualisieren?"

Haben Sie versucht, “wp_insert_post_data” anstelle von “pre_post_update” zu verwenden?

Da Ihre Logik auf der Rolle basiert, geben Sie publish_posts keine publish_posts Fähigkeit? Wie funktioniert die native Contributor- Rolle?

Also habe ich den wp_insert_post_data-Filter verwendet und kam zu dem folgenden Ergebnis, das nach dem Test anscheinend richtig funktioniert.

 add_filter('wp_insert_post_data', 'change_post_status', '99'); function change_post_status($data) { if( (current_user_can('role')) && ($data['post_type'] == 'custom_post_type') ) { if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; //then set the fields you want to update $data['post_status'] = 'draft'; } return $data; } 

Ich möchte noch ein weiteres Thema hinzufügen. Wenn du den obigen Code verwendest, wird es JEDEM Post passieren, auch wenn du ein Update im Backend machst! Da wp_insert_post_data immer dann ausgetriggers wird, wenn ein Beitrag aktualisiert wird, also zB wenn der Administrator einen Beitrag veröffentlichen möchte – dieser wird automatisch erneut ausgetriggers und der Beitrag auf Entwurf gesetzt. Es wird also nicht mehr möglich sein, sich zu veröffentlichen. Hier ein geänderter Code, der für mich funktioniert hat, überprüfe ob wir im Admin-Backend sind:

 function change_post_status ($ data, $ postarr) {
       $ data ['post_status'] = 'Entwurf';
       gibt $ data zurück;
 }
 if (! (is_admin ())) {
   add_filter ('wp_insert_post_data', 'change_post_status', '99', 2);
 }