webentwicklung-frage-antwort-db.com.de

Wie kann ich mich in vorhandene WordPress-Massenaktionen einbinden?

Ich erstelle ein Plugin, das sowohl Standarddaten WP als auch benutzerdefinierte Felder in einem benutzerdefinierten Meta-Feld auf Nachbearbeitungsseiten mithilfe von SQL-Abfragen mit einer externen Ressource synchronisiert. Meine Funktionen funktionieren derzeit jedoch nur beim Verwalten einzelner Posts und ich versuche, Unterstützung für vorhandene Massenaktionen hinzuzufügen (In den Papierkorb verschieben, Aus Papierkorb wiederherstellen und Bearbeiten). Momentan ist meine Synchronisierungsfunktion in save_post eingebunden und ich habe Unterstützung für das Löschen von externen Ressourcen mit 'wp_trash_post' und das erneute Einfügen mit 'untrashed_post' hinzugefügt (dies funktioniert jedoch nur, wenn Sie im Papierkorb auf Wiederherstellen klicken, und nicht, wenn Sie auf Rückgängig klicken der Admin-Hinweis nach dem Mülleimer). Hier ist der Code, der sich im __construct für meine Klasse add metabox befindet:

add_action( 'save_post', array( $this, 'save_post_function' ) ); //which eventually calls myOtherClass::runs_sync_to_external_resource_SQL_query($post_id);
add_action( 'wp_trash_post', 'my_delete_function' );
function my_delete_function( $post_id ){
    myClass::runs_delete_from_resource_SQL_query($post_id);
}
add_action( 'untrashed_post', 'my_undelete_function' );
function my_undelete_function($post_id) {
    myOtherClass::runs_sync_to_external_resource_SQL_query($post_id);
}

Ich habe in diesem Blog-Beitrag gelesen , dass benutzerdefinierte Massenaktionen hinzugefügt werden (dies scheint die Referenz zum Thema zu sein), aber es ist nicht ganz das, wonach ich suche, wie ich es tue Sie müssen nicht die Dropdown-Liste "Massenaktionen auswählen" ändern und eine benutzerdefinierte Aktion hinzufügen, sondern müssen sich einfach in den vorhandenen Papierkorb einhängen und Massenaktionen wiederherstellen.

Außerdem muss ich mich in die Massenaktion "Bearbeiten" einbinden, da einige der Daten, die mit meiner externen Ressource synchronisiert werden, über diese Aktion bearbeitet werden können (Kategorien, Tags, Post-Format und Post-Status).

Zuletzt muss ich die Schaltfläche "Rückgängig" aufrufen, um meine Wiederherstellungsfunktion auszuführen. Ich vermute, dass es nicht funktioniert, weil es an Massenaktionen gebunden ist.

Irgendein Rat? Danke im Voraus

BEARBEITEN: Hier ist der überarbeitete Code von oben unter Verwendung von Statusübergangshooks:

add_action( 'save_post', array( $this, 'save_post_function' ) ); //which eventually calls pluginname_sync::pluginname_syncpost($post->ID);
add_action( 'transition_post_status', 'cp_sync', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {
            if ( $old_status == 'publish'  &&  $new_status != 'publish' ) {
                pluginname_sync::pluginname_delete($post->ID);
            }
            if ( $old_status != 'publish'  &&  $new_status == 'publish' ) {
                pluginname_sync::pluginname_syncpost($post->ID);
            }
        }
1
T Andrew

Wie Sie beschreiben, möchten Sie Daten synchronisieren, wenn ein Beitrag gelöscht, bearbeitet oder gelöscht wird. Sie versuchen es mit der Aktion save_post, aber sie wird nur auf Post-Edit-Bildschirmen ausgelöst (laut Codex wird diese Aktion beim Importieren, Bearbeiten von Post/Page-Formularen, Xmlrpc oder per E-Mail ausgelöst) Aktionen und schnelle Bearbeitung, aber Sie sind falsch. Es gibt keine spezifischen Speicheraktionen, die ausgelöst werden, wenn ein Beitrag durch Massenaktionen oder Schnellbearbeitung bearbeitet wird (der Link, den Sie zum Hinzufügen benutzerdefinierter Massenaktionen gepostet haben, dient dazu, benutzerdefinierte Massenaktionen hinzuzufügen, und nicht zum Ausführen von Aufgaben für vordefinierte Massenaktionen).

Aus meiner Sicht gibt es nichts Passenderes für Post-Status-Übergänge als das Synchronisieren von Daten.

Sie haben versucht, Statusübergänge zu erstellen, jedoch mit falscher Logik. Beispielsweise können Sie die Löschsynchronisierungsfunktion ausführen, wenn ein Beitrag von "veröffentlicht" zu "nicht veröffentlicht" wechselt. Dies bedeutet jedoch nicht, dass ein Beitrag gelöscht wird: Ein nicht veröffentlichter Beitrag kann in den Papierkorb verschoben werden, ein Entwurf, ein zukünftiger Beitrag usw.

Sehen wir uns einige Beispiele an:

add_action( 'transition_post_status', 'cp_sync', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {

    // Check $old_status also if you need specific actions
    // when the post transits from a specific status

    if ( $new_status == 'draft' ) {
        // The post is now draft, no matter what status it had previously
        // sync draft posts here
    }

    if ( $new_status == 'publish' ) {
        // The post is now published, no matter what status it had previously
       // sync published posts here
    }

    if ( $new_status == 'trashed' ) {
        // The post is now in the trash, no matter what status it had previously
        // sync trashed posts here
    }

    // Cotinue checking more post statues if you need (future, private, etc)
    // For a complete list, see https://codex.wordpress.org/Post_Status_Transitions 

}

Es gibt keinen Statusübergang für gelöschte Posts. Sie müssen eine der Aktionen verwenden, die in den Dokumenten für delete_post action beschrieben sind. Ich würde before_delete_post verwenden, wenn Sie alle Post-Daten abfangen müssen:

add_action( 'before_delete_post', 'my_func' );
function my_func( $postid ){
    // Post has been deleted
    pluginname_sync::pluginname_delete( $postid );
}

BEARBEITEN

Beispiel: Nur veröffentlichte Beiträge synchronisieren, den Rest aus der externen Datenbank löschen:

add_action( 'transition_post_status', 'cp_sync', 10, 3 );
function cp_sync( $new_status, $old_status, $post ) {

    // This will cover the transition from any status to published,
    // including published to published.
    if ( $new_status == 'publish' ) {
        pluginname_sync::pluginname_syncpost($post->ID);
    } else {
        pluginname_sync::pluginname_delete($post->ID);
    }

}
add_action( 'before_delete_post', 'my_func' );
function my_func( $postid ){
    pluginname_sync::pluginname_delete( $postid );
}
1
cybmeta