Ejecutar acción después de guardar una entrada con todos sus registros post_meta (datos)

22 jun 2015, 15:26:15
Vistas: 29K
Votos: 6

Tengo que ejecutar código PHP personalizado después de que se guarde una nueva entrada con todos sus meta datos.

Mi pregunta es ¿cómo lograr esto? Probé con la acción save_post, pero se ejecuta antes de que se guarden los registros meta, así que no puedo usarla en este caso.

Entonces, ¿cómo puedo ejecutar mi función personalizada después de que la entrada con todos los datos relacionados se haya guardado en la base de datos?

ACTUALIZACIÓN: Intenté lograrlo con el siguiente código en el archivo functions.php:

add_action( 'save_post', 'wpse41912_save_post' );

function wpse41912_save_post() {
// obtener información sobre la última entrada añadida
    $args = array( 'numberposts' => '1', 'post_type' => 'post' );
    $recent_posts = wp_get_recent_posts( $args );
    $myFunc_latest_id = $recent_posts[0]['ID']; // id de la última entrada
    $myFunc_post_details = get_post($myFunc_latest_id);
    print_r($myFunc_post_details);

    // ¿cómo ejecutar código php cuando se haya añadido todo el post meta?

}

¡Gracias de antemano!

2
Comentarios

¿Se guarda el meta del post en la misma función?

Manny Fleurmond Manny Fleurmond
22 jun 2015 15:54:38

Mmm, no estoy seguro de tu pregunta... Por favor revisa la parte actualizada de mi pregunta, parte del archivo function.php

user198003 user198003
22 jun 2015 16:11:43
Todas las respuestas a la pregunta 4
5

Para el tipo de entrada NUEVO 'post' usa el hook de acción draft_to_publish:

function fpw_post_info( $post ) {
    if ( 'post' == $post->post_type ) {
        // echo '<pre>'; print_r( $post ); echo '<br />';
        // $meta = get_post_meta( $post->ID ); print_r( $meta ); echo '</pre>'; die();
        // tu código personalizado va aquí...
    }
}
add_action( 'draft_to_publish', 'fpw_post_info', 10, 1 );

En tu función de callback $post es tu entrada como objeto WP_post. Obtendrás los metadatos de la entrada llamando a la función get_post_meta.

Para entradas NUEVAS o ACTUALIZADAS del tipo 'post' usa el hook de acción publish_post:

function fpw_post_info( $id, $post ) {
    // echo '<pre>'; print_r( $post ); echo '<br />';
    // $meta = get_post_meta( $post->ID ); print_r( $meta ); echo '</pre>'; die();
    // tu código personalizado va aquí...
}
add_action( 'publish_post', 'fpw_post_info', 10, 2 );

¡En este caso la función de callback toma dos parámetros!

23 jun 2015 01:12:22
Comentarios

Gracias, pero no pasa nada al usar el gancho de acción publish_post... También intenté usar el gancho added_post_meta pero se ejecuta después de cada meta añadida al post - necesito el que se ejecute después del último meta añadido

user198003 user198003
23 jun 2015 10:39:51

¿Qué quieres decir con que no pasa nada? ¿Usaste el código anterior sin descomentar los primeros dos comentarios? ¿Muéstrame tu código? ¿Lo usas para un tipo de entrada personalizado o solo para 'post'?

Frank P. Walentynowicz Frank P. Walentynowicz
23 jun 2015 16:37:38

Lee la respuesta actualizada para el uso correcto del gancho de acción publish_post.

Frank P. Walentynowicz Frank P. Walentynowicz
23 jun 2015 17:37:25

¿Esto funciona también para productos de WooCommerce?

Amjad Amjad
19 mar 2019 03:07:29

Un producto de WooCommerce es un tipo de publicación personalizada. La solución anterior funciona con cualquier tipo de publicación.

Frank P. Walentynowicz Frank P. Walentynowicz
19 mar 2019 05:09:10
0

Solución bastante tonta, pero funciona:

function afterPostUpdated($meta_id, $post_id, $meta_key='', $meta_value=''){
    if($meta_key=='_edit_lock') {
        if($_GET['message']==1) {
            //
            Tu código aquí
            // 
        }
    }
}
add_action('updated_post_meta', 'afterPostUpdated', 10, 4);
21 ene 2016 20:56:27
0

Podrías usar esto:

function miFuncion($post_id, $post, $update) {
    // tu código aquí
}

add_action('save_post', 'miFuncion');

$update es un booleano que devuelve false si es una entrada nueva. Si es una actualización, devuelve true.

Aquí está la documentación: https://developer.wordpress.org/reference/hooks/save_post/

28 may 2020 12:59:50
0

La respuesta correcta y más simple es utilizar la acción wp_insert_post.

https://developer.wordpress.org/reference/hooks/wp_insert_post/

Una distinción importante de la acción wp_insert_post es que se activa después de que se haya llamado a update_post_meta.

Hay 3 parámetros disponibles - la bandera $update te indica si es un post nuevo o actualizado.

add_action('wp_insert_post', 'run_after_post_updated', 10, 3);    
function run_after_post_updated($post_ID, $post = null, $update = true) {
   //aunque la documentación dice 3 parámetros, parece que a veces solo se pasa el postid - por lo que necesitas valores por defecto para los otros 2 parámetros
   $meta = get_post_meta( $post_ID ); 
   //  ...
}
9 feb 2022 17:39:42