it-swarm.com.de

Plugin-Entwicklung: Wordpress wird nach dem Update zweimal ausgeführt. Wie überspringe ich den ersten Prozess?

Wenn Sie ein Plugin erstellen und eine Prozessfunktion einrichten, führt Wordpress die Plugin-Prozessfunktion zweimal aus, wenn Sie auf die Schaltfläche "Aktualisieren" klicken. Ich glaube, der erste Prozess ist für die Versionierung (Revision), und der zweite ist der eigentliche Beitrag.

Jetzt habe ich eine INSERT-Funktion in meinem Prozess, daher werden die Daten jetzt zweimal eingefügt.

Was ist der beste Weg, um sicherzustellen, dass die Verarbeitung nicht während der Erstellung der Revision und nur während der eigentlichen Nachbearbeitung erfolgt?

* Hinweis: Ausrichtung auf Wordpress 3.0+ *

Ein Beispiel (komplettes Plugin):

<?php
/*
Plugin Name: Something Amazing
Plugin URI: http://www.somewhere.com/
Description: Displays something.
Author: Some guy
Version: 1.0
Author URI: http://www.somewhere.com/
*/
function call_something() {
 return new something();
}
if (is_admin()) add_action('load-post.php','call_something');

class something {

 public function __construct() {
  add_action('add_meta_boxes',array(&$this,'something_add_boxes'));
  add_action('save_post',array(&$this,'something_process'),1,1);
 }

 public function something_add_boxes() {
  add_meta_box('something','Some Thing',array(&$this,'something_form'),'post','side','default');
 }

 public function something_form($post,$args) {
  echo '<p><input type="text" name="somethingnew" /></p>';
 }

 public function something_process($id) {
  echo 'hey there! I\'m going to cause a redirect warning, but you will see this line twice per submit!';
  //do_something_amazing();
 }
}
?>

Vielleicht gibt es einen besseren Hook zum Verarbeiten, der es nicht ermöglicht, zweimal zu schreiben?

1
Exit

@Steve-Funktionen, die sich an save_post binden, werden immer zweimal aufgerufen, Wordpress-Aufruffunktionen, die sich zweimal an save_post binden, weil:

  • beim ersten Mal wird die nachträgliche Überarbeitung gespeichert.
  • beim zweiten Mal wird der aktuelle Beitrag gespeichert.

HINWEIS: Wenn Sie Beitragsrevisionen mit define('WP_POST_REVISIONS', false); deaktiviert haben, wird der Haken save_post nur einmal ausgelöst, wenn der tatsächliche Beitrag gespeichert wird.

Ich habe gerade den folgenden Code getestet und er funktioniert wie erwartet und das Echo wird in der Funktion something_process nur einmal ausgeführt.

ANMERKUNG: wie ich mich an save_post gehakt habe

<?php
/*
Plugin Name: Something Amazing
Plugin URI: http://www.somewhere.com/
Description: Displays something.
Author: Some guy
Version: 1.0
Author URI: http://www.somewhere.com/
*/
function call_something() {
 return new something();
}
if (is_admin()) add_action('load-post.php','call_something');

class something {

 public function __construct() {
  add_action('add_meta_boxes',array(&$this,'something_add_boxes'));
  add_action('save_post',array(&$this,'something_process'),1,2);
 }

 public function something_add_boxes() {
  add_meta_box('something','Some Thing',array(&$this,'something_form'),'post','side','default');
 }

 public function something_form($post,$args) {
  echo '<p><input type="text" name="somethingnew" /></p>';
 }

 public function something_process($id, $post_object) {
    // don't run the echo if this is an auto save
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        return;

    // don't run the echo if the function is called for saving revision.
    if ( $post_object->post_type == 'revision' )
        return;

  echo 'hey there! I\'m going to cause a redirect warning, but you will see this line twice per submit!';
  //do_something_amazing();
 }
}
?>
4

Sie müssen sicherstellen, dass Ihr Code nur ausgeführt wird, wenn der Beitrag gespeichert wird, und nicht, wenn eine Überarbeitung oder ein automatisches Speichern ausgeführt wird.

Überprüfen Sie auf diese Weise, ob die aktuelle Beitrags-ID tatsächlich ein tatsächlicher Beitrag und keine Überarbeitung oder ein automatisch gespeicherter Beitrag ist (der tatsächliche Beitrag gibt immer einen FALSCHEN Wert zurück):

if ( is_int( wp_is_post_revision( $id ) ) )
    return;

if( is_int( wp_is_post_autosave( $id ) ) )
    return;
2
Vix

In meinen Plugins mache ich eine Überprüfung des Poststatus einer Revision. Sie können so etwas in der Funktion "etwas verarbeiten" tun.

public function something_process($id, $post) {
    if ($post->post_type == 'revision') return;
    echo 'hey there! I\'m going to cause a redirect warning, but you will see this line twice per submit!';
    //do_something_amazing();
}

Durch Hinzufügen der Zeile if ($post->post_type == 'revision') return; "brechen" Sie den ersten Funktionsaufruf in WP ab.

Sie müssen auch eine zweite Änderung am Aktionshaken vornehmen. Ändern Sie einfach die Zeile:

add_action('save_post',array(&$this,'something_process'),1,1);

dazu:

add_action('save_post',array(&$this,'something_process'),1,2);

So übergeben Sie den zweiten Parameter an die Aktion "save_post" (die Variable $post)

1
Caio Alves

sie können das automatische Speichern vermeiden, indem Sie Ihre Funktion auf einfache Weise überprüfen

if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return '';
    }

aktualisieren

Fügen Sie, wie ich bereits geschrieben habe, das obige Snippet ganz oben in Ihre something_process -Funktion ein, bevor Sie etwas anderes tun.

1
Bainternet

Ich habe gehört, Sie suchen den "besten" Weg ... nun, das hängt davon ab. Code muss sich mit benutzerdefinierten Problemen befassen - genau wie Sie keinen Cadillac für den Offroad-Einsatz auswählen und (wahrscheinlich) keinen Jeep für eine Nacht in der Oper mitnehmen würden.

Ich habe ein Plugin, das beide Prozesse verarbeitet, die absichtlich ausgeführt werden. Ich verwende eine statische Variable und wähle bedingt aus, welchen Code ich ausführen möchte. Ich teste auch mit der oben genannten Funktion wp_is_post_revision () auf die ID des übergeordneten Elements und habe eine größere Flexibilität bei der Anpassung der Bedingungen, um meine Anforderungen genau basierend auf diesen Ergebnissen zu erfüllen.

function complex_meta_update_on_save($id){
$ppid = wp_is_post_revision($id);
(can also employ) if($post_parent_id === false) $ppid = $id;
...set environmentals...

static $tc;
if($tc < 1){
execute conditions essential  for revisions, or preprocess for ppid 
}
//note no else-
i can do stuff here that is ok to duplicate, processing, etc. 

if($tc > 0) {
execute conditions and statements essential for post parents
update custom tables with custom queries, register newly processed taxonomies, et. al. 
keep in mind, on Save hook, post data has been saved in db. My plugin uses special  
metadata that needs to know whether I've got a revision, or the parent. 
update_post_meta($id, $blah);now is ok to use $id in
}
//oh the staticness of it all
$tc++;
}//end function

Ich weiß nicht, dass all das brillant ist oder auch nur die beste Idee, es funktioniert genau dort, wo ich es brauche - und ich muss nicht viel mehr Hooks verwalten als editieren und speichern ... in einer Hinsicht ziemlich einfach.

0
bellasys