Hook para cuando se envía una publicación a la papelera
Quiero realizar una acción cuando elimino uno de mis custom post types, ¿qué hook debería usar:
wp_trash_mycpt
o
trash_mycpt
Mi acción debería ejecutarse únicamente cuando mycpt
está en los estados 'publish', 'draft' o 'future'
y pasa al estado 'trash'. Cuando se elimina definitivamente de la papelera no hay necesidad de ejecutar la función nuevamente.

El hook wp_trash_post
podría ser lo que estás buscando:
Se ejecuta antes de que una entrada sea enviada a la papelera.
También existe el hook trashed_post
:
Se ejecuta después de que una entrada es enviada a la papelera.
Aquí tienes un código no probado para empezar:
function my_wp_trash_post( $post_id ) {
$post_type = get_post_type( $post_id );
$post_status = get_post_status( $post_id );
if ( $post_type == 'mycpt' && in_array(
$post_status, array( 'publish','draft','future' )
)) {
// haz lo que necesites
}
}
add_action( 'wp_trash_post', 'my_wp_trash_post' );

¿No cambia la función wp_trash_post()
el post_status
a trash
antes de llamar al hook wp_trash_post
?

No, después. Solo mira el código.

Me alegra que lo hayan cambiado. ¡Recuerdo haber revisado esto hace un par de años y ese no era el caso!

@dalbaeb Hasta ahora he estado usando el hook trash_post, ¿cuál es la diferencia entre ese y wp_trash_post?

Además, ¿no sería mejor usar wp_trash_mycpt en lugar de verificar el tipo de publicación dentro de la función?

@drtanz Porque trash_post
está obsoleto. Además, no puedo encontrar un hook variable para este tipo de acción (¿tienes un enlace?), así que wp_trash_post
es realmente la mejor opción que tienes.

Aquí hay un ticket relacionado: http://core.trac.wordpress.org/ticket/15628
De hecho, estoy usando trash_mycpt en mi plugin y funciona bien, así que asumí que wp_trash_mycpt también funcionaría.

Ejecuta tu función cuando el estado de la publicación cambie de cualquiera de publish
, draft
o future
a trash
.
<?php
function my_function() {
global $post;
if('my_post_type' == $post->post_type) {
// haz tus operaciones aquí
}
}
add_action('publish_to_trash', 'my_function');
add_action('draft_to_trash', 'my_function');
add_action('future_to_trash', 'my_function');
Más información: Transiciones de Estado de Publicación

Existe una acción wp_trash_post
que se llama, pero el post_status
se cambia a trash
de antemano, lo que significa que no podrías verificar si el Post estaba publicado, etc.
EDITADO Me corrijo, el post_status
se cambia a trash
DESPUÉS de que se llama la acción.
Esto debería ayudarte a comenzar -
add_action('wp_trash_post', 'my_wp_trash_post')
function my_wp_trash_post(){
if($post->post_type === 'mycpt') :
// Haz lo que necesites hacer aquí
endif;
}
Si es de utilidad, también existe una acción delete_post
. Para más información, consulta la Referencia de Acciones para delete_posts
.
