Función para ejecutar cuando una publicación se mueve a la papelera.

9

Hola, ¿hay alguna acción que se pueda realizar mientras una publicación se mueve a la papelera? Intenté delete_post y deleted_post. Funciona dos veces para cada acción (antes y después de la acción tal como está escrita en el códice) y la salida se muestra solo cuando la publicación se elimina de la papelera. Ejemplo: quiero enviar un correo electrónico al autor indicando que su publicación se ha movido a la papelera por algún motivo y actualizar alguna user_meta. si yo uso

add_action('deleted_post', 'emailUser');

o

add_action('delete_post', 'emailUser');

funciona solo cuando la publicación se elimina de la papelera. . .

Actualización: lo hice funcionar para publicaciones de basura usando

add_action('trash_post', 'emailUser');

pero el problema para la doble ejecución de la función sigue ahí. . .

Harjeet Singh
fuente
1
Escriba la solución a continuación y márquela como respuesta
Ashfame
no es la respuesta correcta ya que la doble ejecución de la función todavía está allí ...
Harjeet Singh

Respuestas:

10

¡Esto hará el truco!

add_action('trash_post','my_trash_post_function',1,1);
function my_trash_post_function($post_id){
    if(!did_action('trash_post')){
        // do stuff
    }
}

Aquí agregamos la función y para evitar que el gancho se ejecute más de una vez usando did_action:

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

Como siempre, este tipo de ganchos toman la forma {post_status}_{post_type}, por lo que trash_post, trash_page, trash_customposttype, publish_pageetc.

Tom J Nowell
fuente
2

Esa acción se llamará una vez cuando la publicación se mueva a la papelera, y luego nuevamente cuando la papelera se vacíe.

Su función podría verificar la presencia de una opción con la ID de publicación en el nombre, si la opción no está allí, envía el correo electrónico y luego establece la opción. Si la opción está allí (por ejemplo, se llama por segunda vez), no enviaría el correo electrónico.

¡Recuerde entonces eliminar la opción, para que su base de datos no se llene con ellas!

add_action( 'delete_post', 'emailUser' );

function emailUser( $postid ) {

   if ( ! get_option( 'user_emailed_' . $postid ) ) {
      // send email here
      update_option( 'user_emailed_' . $postid, 'anything' );
   } else {
      delete_option( 'user_emailed_' . $postid );
   }

}

¡Avísame si eso funciona!

Simon Blackbourn
fuente
puede usar la API de transitorios en lugar de las opciones, por lo que no tendrá que preocuparse por eliminar opciones de la base de datos codex.wordpress.org/Transients_API
Bainternet
Gracias Simon que funciona muy bien. . . . No sé cómo y por qué me perdí esto. . ..
Harjeet Singh
Bainternet, vi los transitorios y son bastante similares a get_option en mi caso y también me quedaré con get_option para eliminar, ya que la ejecución dependería también del rendimiento del servidor y del cálculo del tiempo de ejecución del código antes y después de la eliminación de La publicación puede ser difícil.
Harjeet Singh
No hay necesidad de comenzar a agregar / editar campos de opciones o transitorios, agregando consultas adicionales. En su lugar, simplemente llame a did_action para verificar si el gancho ya se ha disparado.
Tom J Nowell
1
add_action('trash_post', 'trash_post_function_name');

El gancho anterior no funcionó para mí en WP 4.7.5.

Esto es lo que funcionó para mí.

add_action('wp_trash_post', 'trash_post_function_name');
Mohamed Salem Lamiri
fuente