web-dev-qa-db-fra.com

Comment puis-je me connecter à des actions WordPress Bulk existantes?

Je crée un plug-in qui synchronise à la fois les données standard WP et les champs personnalisés d'une méta-boîte personnalisée sur des pages de publication, à une ressource externe à l'aide de requêtes SQL. Toutefois, mes fonctions ne fonctionnent actuellement que lorsque je gère des publications uniques et j'essaie d'ajouter une prise en charge des actions en bloc existantes (Déplacer vers la corbeille, Restaurer à partir de la corbeille et Modifier). Actuellement, ma fonction de synchronisation est connectée à save_post et j'ai ajouté un support pour la suppression de ma ressource externe en utilisant 'wp_trash_post' et en réinsérant en utilisant 'untrashed_post' (bien que cela ne fonctionne que lorsque vous cliquez sur Restaurer dans la corbeille et non en cliquant sur Annuler dans l’avis de l’administrateur après la corbeille). Voici le code qui se trouve dans la __construct pour ma classe add metabox:

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);
}

J'ai lu ce billet de blog à propos de l'ajout d'actions en bloc personnalisées (ce qui semble être la référence absolue sur le sujet), mais ce n'est pas tout à fait ce que je souhaite. Je cherche car je n'ai pas besoin de modifier les actions en bloc. Sélectionnez une liste déroulante et ajoutez une action personnalisée. Vous devez simplement vous connecter à la corbeille existante et restaurer des actions en bloc.

De plus, je vais devoir m'inscrire à l'action Editer en bloc car certaines données synchronisées avec ma ressource externe peuvent être éditées à partir de cette action (catégories, balises, format et statut de publication).

Enfin, je dois obtenir le bouton Annuler pour exécuter ma fonction de restauration. Je soupçonne que cela ne fonctionne pas, car il est lié à des actions en bloc.

Aucun conseil? Merci d'avance

EDIT: Voici le code révisé ci-dessus utilisant les crochets de transition de statut:

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

Comme vous le décrivez, vous souhaitez synchroniser les données lorsqu'une publication est supprimée, modifiée ou supprimée. Vous essayez avec l'action save_post, mais elle ne se déclenche que sur les écrans de post-édition (selon le codex, cette action est déclenchée lors de l'importation, du formulaire de modification/page, xmlrpc ou de la publication par courrier électronique). actions et édition rapide, mais vous avez tort. Aucune action de sauvegarde spécifique n'est déclenchée lorsqu'une publication est modifiée en bloc ou par édition rapide (le lien que vous avez posté sur l'ajout d'actions Bulck personnalisées sert à cela, il permet d'ajouter des actions en bloc personnalisées et non d'effectuer des tâches sur des actions en bloc prédéfinies).

De mon point de vue, rien de plus approprié pour les transitions post-statut que la synchronisation des données.

Vous avez essayé des transitions post-statut mais avec une logique erronée. Par exemple, vous exécutez la fonction de suppression de synchro quand une publication passe de publication en publication non publiée, mais cette situation ne signifie pas qu'une publication est supprimée: une publication non publiée peut être supprimée, un brouillon, une publication future, etc.

Voyons quelques exemples:

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 

}

Il n'y a pas de transition de statut pour les publications supprimées, vous devez utiliser l'une des actions décrites dans la documentation pour l'action delete_post ; Je voudrais utiliser before_delete_post si vous devez récupérer toutes les données de publication:

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

MODIFIER

Exmpale: Synchronisez uniquement les publications publiées, supprimez le reste de la base de données externe:

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