web-dev-qa-db-fra.com

Devrais-je utiliser add_action ('publish_post ou add_filter (' publish_post?

J'essaie de déclencher une fonction supplémentaire dès qu'un certain type de message personnalisé est publié.

function insert_table_products($post_id, $post) {
    if ($post->post_type == 'custom-products') {
        global $wpdb;
        $custom_meta = get_post_meta($post_id);
        //print_r($custom_meta);
        //print_r($post);
        $attachments = new Attachments('my_attachments');
        if ($attachments->exist()) :
            $my_index = 0;
            $use_image = new SplFileInfo($attachments->url($my_index));
            $use_main_image = $use_image->getFilename();
        endif;

        $wpdb->insert(
                'products', array(
            'product_code' => $custom_meta['product_code'][0],
            'product_name' => $post->post_title,
            'product_img_name' => $use_main_image,
            'price' => $custom_meta['product_price'][0], //$POST['acf-field-price_patch'],
            'product_inventory' => $custom_meta['product_stock'][0], //$POST['fields[field_54df75e760b5e]'],
                )
        );
    }
}
add_filter('publish_post', 'insert_table_products', 10, 2);
//add_action( 'publish_post', 'insert_table_products', 10, 2);

Aucun des crochets ne fonctionne. Je m'attendais à ce que le print_r affiche des données

BTW, j'ai aussi une fonction de mise à jour, déclenchée par

//add_filter('edit_post', 'update_table_products', 10, 2);

qui ne semble pas non plus fonctionner correctement.

Des idées?

1
alex

publish_post ne fonctionne pas pour les types de publication personnalisés, le hook correct (action hook) est publish_{$custom_post_type}. Vous devez utiliser add_action() car il s'agit d'un crochet d'action.

J'ai aussi tendance à utiliser le hook transition_post_status, qui est beaucoup plus universel puisqu'il se déclenche chaque fois que le statut d'une publication est modifié. Vous pouvez utiliser $old_status et $new_status pour vérifier le statut précédent et nouveau d'un message, puis effectuez une action.

Pour un nouveau message, vous pouvez quelque chose comme ceci: ( Nécessite PHP 5.3+ )

add_action( 'transition_post_status', function ( $new_status, $old_status, $post )
{

    if( 'publish' == $new_status && 'publish' != $old_status && $post->post_type == 'my_post_type' ) {

        //DO SOMETHING IF NEW POST IN POST TYPE IS PUBLISHED

    }
}, 10, 3 );

MODIFIER

Pour les modifications postérieures/mises à jour, en utilisant transition_post_status, vous pouvez faire

add_action( 'transition_post_status', function ( $new_status, $old_status, $post )
{

    if( 'publish' == $new_status && 'publish' == $old_status && $post->post_type == 'my_post_type' ) {

        //DO SOMETHING IF A POST IN POST TYPE IS EDITED

    }
}, 10, 3 );

Pour en savoir plus sur la transition post-statut, vous pouvez consulter le codex

EDIT 2

Les champs personnalisés, intégrés dans le plug-in de champs personnalisés avancés, utilisent le save_post hook, qui s'exécute après la post-transition. Il est donc inutile d'essayer d'ajouter des champs personnalisés.

Pour les types de publication personnalisés, un nouveau hook appelé save_{$post_type} a été introduit pour faciliter les choses. Ce hook est également recommandé par le forum ACF pour mettre à jour les champs personnalisés.

5
Pieter Goosen