Ejecutar función cuando se publica una entrada

19 oct 2012, 01:14:54
Vistas: 21.3K
Votos: 5

Estoy intentando usar esta función que he creado cuando una entrada se publica por primera vez.

function a_new_post($post){
  $post_id = $post->ID;

  if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
      // ...ejecutar código una vez
      update_post_meta( $post_id, 'firstpublish', true );
  }
}
add_action( 'draft_to_published', 'a_new_post' );

No veo nada mal en el código, pero cuando intento crear algunas entradas de prueba y reviso la base de datos, el campo "firstpublished" no se ha creado.

¿Alguien ve algo mal?

3
Comentarios

¿no deberías cambiar el hook a publish_post? draft_to_publish no se ejecutará en todos los casos

Mridul Aggarwal Mridul Aggarwal
19 oct 2012 10:40:35

Esto es lo más frustrante con lo que me he topado en WordPress. No hay absolutamente ninguna forma de capturar la publicación y bloquear la actualización. De ninguna manera, de ningún modo.

User User
1 may 2014 23:53:02
Todas las respuestas a la pregunta 2
0
18

La acción correcta es 'draft_to_publish'.

Para asegurarte de que estás usando el estado correcto, intenta obtener una lista de todos los estados de publicación registrados (incluyendo estados personalizados) con:

<pre><?php print '- ' . implode( "\n- ", array_keys( get_post_stati() ) );?></pre>

En una instalación estándar deberías obtener:

  • publish
  • future
  • draft
  • pending
  • private
  • trash
  • auto-draft
  • inherit

Ten en cuenta que publish_post se llama cada vez que editas una publicación publicada.

También nota que get_post_stati() es uno de esos nombres impredecibles en WordPress: es simplemente incorrecto. El plural del sustantivo status es statuses en inglés y statūs en latín. :D

También podrías engancharte a 'transition_post_status', dependiendo de tus necesidades. Recibes el nuevo y el antiguo estado como argumentos, el tercer argumento es el objeto de la publicación. Capturará future_to_publish también, y también publicaciones que fueron eliminadas una vez y republicadas ahora (trash_to_publish).

Ejemplo:

add_action( 'transition_post_status', 'a_new_post', 10, 3 );

function a_new_post( $new_status, $old_status, $post )
{
    if ( 'publish' !== $new_status or 'publish' === $old_status )
        return;

    if ( 'post' !== $post->post_type )
        return; // restringe el filtro a un tipo de publicación específico

    // haz algo increíble
}
19 oct 2012 12:25:18
0

Establecer el valor meta del tiempo del primer guardado es muy fácil de aplicar la primera vez.

function a_new_post( $post_id, $post, $update ) {
    if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
        update_post_meta( $post_id, 'firstpublish', true );
    }
}
add_action( 'save_post', 'a_new_post', 10, 3 );
6 mar 2018 14:31:52