cuál es la forma correcta de enganchar cuando se actualiza

19

Intento enganchar cuando se actualiza la publicación, pero todos los enganches que intento nunca se ejecutan, excepto updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

He intentado esto add_action('save_post', 'my_function');pero no se hizo eco de ninguna identificación, o tal vez este mensaje ya se repite pero nunca se procesa debido al encabezado de redireccionamiento enviado.

rusly
fuente
2
tienes un espacio después save_post, ¿es un error tipográfico aquí o estaba en tu código original? Además, habilite la depuración durante el desarrollo.
Milo
@Milo lo siento error tipográfico, pero no en el código original
rusly
si ese es el caso, entonces debería ver su salida en la esquina superior izquierda de la pantalla al crear una nueva publicación. guardar una publicación existente ocurre antes de una redirección, por lo que no verá nada a menos que tenga habilitada la depuración.
Milo

Respuestas:

55

Cuando se actualiza una publicación, hay algunos ganchos que se activan:

  • 'pre_post_update'es una acción disparada justo antes de que se actualice la publicación, el argumento pasado es 2: $post_IDy $dataesa es una matriz de todas las otras columnas de la base de datos de la tabla de publicación
  • 'transition_post_status'es un gancho activado en la actualización y pasa 3 argumentos: $ new_post_status $old_post_statusy $post(objeto).
  • Luego, hay otros 2 ganchos de transición disparados, pero tienen un nombre dinámico, lo que significa que la acción efectiva disparada depende del estado de publicación anterior y nuevo. "{$old_status}_to_{$new_status}"y "{$new_status}_{$post->post_type}". Primero pase el único objeto de publicación como argumento, el segundo pase el id de publicación y el objeto de publicación. Encuentra documentación aquí .
  • 'edit_post'que pasan 2 argumentos: $post_IDy $post(objeto)
  • 'post_updated'que pase 3 argumentos: $post_ID, $post_after(objeto poste después de la actualización), $post_before(objeto poste antes de la actualización)
  • Otro gancho dinámica: "save_post_{$post->post_type}"que depende del tipo de mensaje, por ejemplo, para mensajes estándar es 'save_post_post'y para las páginas es 'save_post_page', este gancho pase 3 argumentos: $post_ID, $post(objeto) y $updateque es un valor booleano (verdadero o falso) que es cierto cuando se realiza una actualización, en De hecho, este gancho se dispara también cuando se guarda una publicación por primera vez.
  • ' save_post' que se activa tanto en la actualización como en el primer guardado, y pasa los mismos 3 argumentos del enlace anterior.
  • ' save_post_{$post_type}' que se activa tanto en la actualización como en el primer guardado, y pasa los mismos primeros 2 argumentos del enlace anterior.
  • Finalmente tienes ' wp_insert_post' , que se dispara tanto en la actualización como en el primer guardado, y pasa los mismos 3 argumentos de los 2 ganchos anteriores.

Estos enlaces se activan cada vez que se actualiza una publicación, tanto a través de páginas de administración en el backend como cuando se actualizan "manualmente" mediante las funciones wp_update_posto wp_insert_post.

Cuando la publicación se actualiza utilizando páginas de administración, se activan ganchos adicionales, un ejemplo es 'update_post_redirect'o 'post_updated_messages'. (Vea esto y las respuestas de este WPSE para ejemplos de uso).

Tenga en cuenta que si desea utilizar algunos argumentos de ganchos, ese no es el primero, debe declararlo explícitamente en la add_actionllamada.

Por ejemplo, si desea utilizar el '$update'argumento (que es el tercero) del 'save_post'gancho, debe agregarlo 3como $accepted_argsparámetro add_action( ver documentos ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

Última nota sobre el tiempo : debe estar seguro de que add_actionse llama antes de que se active la acción, o no hará nada.

Por ejemplo, este código:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

no hará nada, porque la acción se agrega después de que se dispara el gancho. Aquí es fácil reconocerlo, en el mundo real el código no siempre es así.

gmazzap
fuente
Creo que el gancho de acción 'save_post' también se dispara al presionar Agregar nuevo (Publicar, Página, CPT) en el tablero. Para verte, solo ejecuta este código. function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );¿Por qué la acción 'save_post' se ejecuta en Agregar nuevo en lugar de en Publicar? Para hacer la publicación de borrador automático, supongo.
lowtechsun
@lowtechsun Como se dice en la A, los ganchos se disparan cada vez que se actualiza una publicación, es decir, se guarda en DB. Cuando presiona "Agregar nuevo", cerca de la carga de la página, WP crea una publicación de borrador almacenada en la base de datos para que se enganchen los ganchos.
gmazzap
Gracias por responderme. Acabo de enterarme de esto ayer y pensé que el concepto de esto es confuso. Es decir, primero abro la página para agregar una nueva publicación. En esta etapa, pensé que aún no había creado una publicación. Solo una vez que presiono Publicar, creo que se crea la nueva publicación. Llevando esto más lejos, espero que WP elimine la publicación de borrador automático si presiono Agregar nuevo pero luego salgo de la página sin presionar Publicar.
lowtechsun
2

¿Por qué no enganchar post_updated_messages? De esa manera, puede mostrar este mensaje al igual que la publicación predeterminada de WordPress actualizada.

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

Busque un ejemplo aquí:

http://codex.wordpress.org/Function_Reference/register_post_type

debajo post_updated_messages

Jacob Rambo
fuente