M.K Hossain
Tengo un crm de tipo de publicación personalizado, y necesito enviar un correo después de cada crm guardado o actualizado. utilizo cmb2 para algunos meta personalizados como tema, para usuarios, etc. Conozco el save_post
se enciende el gancho después de guardar la publicación (según el códice de WordPress) en mi caso cuando llamo save_post
con dos parámetros (identificación y publicación) la publicación no contiene valores de actualización. aquí está mi código:
function send_mail_to_user($id, $post){
$crm = $post;
$user_email = array();
if($crm->vc_all_vc == 'on'){
$args = array('orderby' => 'display_name');
$wp_user_query = new WP_User_Query($args);
$authors = $wp_user_query->get_results();
if (!empty($authors)) {
foreach ($authors as $author) {
array_push($user_email , $author->user_email );
}
}
}
else{
$to_users = $crm->vc_users;
$to_program = $crm->vc_program;
$to_group = $crm->vc_group;
$to_excode = $crm->vc_ex_code;
foreach ($to_users as $key => $value) {
$user_data = get_userdata($value);
array_push($user_email, $user_data->user_email);
}
foreach ($to_program as $key => $value) {
$users = get_users( array('meta_key' => 'programs' ) );
if($users){
foreach ($users as $index => $data) {
if(in_array($value , explode('#', $data->programs))){
if(! in_array($data->user_email, $user_email) )
{
array_push($user_email, $data->user_email);
}
}
}
}
}
foreach($to_group as $group) {
$term = get_term_by('slug', esc_attr($group), 'user-group');
$user_ids = get_objects_in_term($term->term_id, 'user-group');
foreach($user_ids as $user_id){
$fc_user = get_userdata($user_id);
if(! in_array($fc_user->user_email, $user_email) )
{
array_push($user_email, $fc_user->user_email);
}
}
}
foreach($to_excode as $codes) {
$value = explode('*',$codes)[1];
$users = get_users( array('meta_key' => 'programs' ) );
if($users){
foreach ($users as $index => $data) {
if(in_array($value , explode('#', $data->programs))){
if(! in_array($data->user_email, $user_email) )
{
array_push($user_email, $data->user_email);
}
}
}
}
}
}
foreach($user_email as $index => $email){
$to = $email;
$subject = $crm->vc_subject;
$body = $crm->post_content;
$headers = array(
'Content-Type: text/html; charset=UTF-8'
);
wp_mail($to, $subject, $body, $headers);
}
}
add_action( 'save_post', 'send_mail_to_user', 10, 2 );
y tambien intento publish_post
gancho, que funciona bien cuando se crea una nueva publicación, pero cuando se actualiza funciona igual. Yo he tratado edit_post
y post_updated
gancho también, pero nunca podré recuperar mis datos de actualización.
Entonces, ¿cómo puedo resolverlo? ¿Qué gancho de acción me dará todos los datos nuevos? gracias de antemano.
Puedes usar algo como esto,
function your_custom_function($meta_id, $post_id, $meta_key='', $meta_value="") {
if($meta_key=='_edit_lock') {
// if post meta is updated
}
}
add_action('updated_post_meta', 'your_custom_function', 10, 4);
-
¡Gracias por compartir eso! Esto es lo que estaba buscando ya que las otras acciones/filtros se activan varias veces.
– Mohammed AlBanna
12 de octubre de 2019 a las 2:37
-
Ya que a partir de la versión 5.6 a
wp_after_insert_post
el gancho está disponible. Verifique esta respuesta: stackoverflow.com/a/71773904/1435770– Djanym
28 de abril a las 4:08
Prueba con post_updated
y use $post_after
objeto.
https://codex.wordpress.org/Plugin_API/Action_Reference/post_updated
-
No funciona para mí, da el título de la publicación de actualización y el contenido de la publicación, pero no actualiza el meta de la publicación.
– M.K Hossain
13 de junio de 2017 a las 10:43
-
En este contexto
$post_after
es una instancia deWP_Post
class, por lo que no incluye meta de publicación personalizada. Usar$meta = get_post_meta($crm->ID);
en su función para obtener todos los metacampos de publicación.– Marian Mircea
13 de junio de 2017 a las 11:19
-
Sí, ya lo hice, pero el problema es el
meta value
Lo que obtuve no es la actualización, probablemente la actualización cmb2meta values
despuéspost_updated
incendios Solo estoy suponiendo eso.– M.K Hossain
14 de junio de 2017 a las 3:32
-
Buena observación. Intente buscar los archivos del complemento para
add_action
cadena, averigüe qué gancho está usando para guardar los metadatos de la publicación, luego actualice su gancho con una prioridad más baja. Su función debería ejecutarse después de que el complemento guarde los valores meta y, con suerte, obtendrá los datos actualizados.– Marian Mircea
14 de junio de 2017 a las 7:25
-
Si está utilizando Advanced Custum Fields (ACF), los ganchos de WP regulares (incluidos los más nuevos como rest_after_insert_{$this->post_type} mencionados en la respuesta de pippas) no funcionarán, debe usar el gancho ACF ‘acf/save_post’ advancedcustomfields.com/resources/acf-save_post
– makkabi
25 de agosto de 2021 a las 14:21
puedes usar esto save_post
gancho con su función. cambie su prioridad de gancho a 100, le dará una publicación actualizada
add_action( 'save_post', 'send_mail_to_user', 100, 2 );
-
Sí, me da datos de actualización, solo para la publicación, no para la publicación meta.
– M.K Hossain
13 de junio de 2017 a las 10:42
Esto puede ser un poco antiguo, pero solo quería dar una actualización ya que desde la versión 5.6.0 está disponible un nuevo gancho. el gancho es wp_after_insert_post
y puedes encontrar más información aquí . Este enlace se activa después de que se crea o actualiza una publicación y se actualizan todos sus términos y metadatos. Puede encontrar un ejemplo a continuación:
add_action( 'wp_after_insert_post', 'send_mail_to_user', 90, 4 );
/**
* Callback to: 'wp_after_insert_post'
* Fires once a post, its terms and meta data has been saved
* @param int $post_id Post ID.
* @param WP_Post $post Post object.
* @param bool $update Whether this is an existing post being updated.
* @param null|WP_Post $post_before Null for new posts, the WP_Post object prior to the update for updated posts.
*
*/
public static function sync_product_registrations_on_update( $post_id, $post, $update, $post_before ) {
if ( 'post' !== $post->post_type ) {
//Only to process the below when post type is 'post' else return
return;
}
if ( ! in_array( $post->post_status, [ 'private', 'publish' ] ) ) {
//To only process when status is private or publish
return;
}
//The rest of your code goes here
}
pipa
Puedes usar el rest_after_insert_{$this->post_type}
gancho (donde $this->post_type
se reemplaza con el tipo de publicación, por ejemplo, ‘publicación’ o ‘mitipo de publicación’).
Gracias a Florian Brinkmann por este enlace.
add_action('rest_after_insert_myposttype', 'myfunction', 10, 3);
function myfunction($post, $request, $creating) {
// $creating is TRUE if the post is created for the first time,
// false if it's an update
// ...
}
Oded Shimoni
Alguna solución es usar $_POST[‘meta_field’] con saneamiento:
$to_users = $_POST['vc_users'];
$to_program = $_POST['vc_program'];
$to_group = $_POST['vc_group'];
$to_excode = $_POST['vc_ex_code'];
$to_users = sanitize_text_field($to_users);
$to_program = sanitize_text_field($to_program);
$to_group = sanitize_text_field($to_group);
$to_excode = sanitize_text_field($to_excode);
Preste atención a los nombres de los campos, usar ACF hará que use la clave de campo.
Este problema es más complicado de lo que parece a primera vista:
Nuestro Gancho ‘post_actualizado’ se está ejecutando antes de que se actualice la publicación, por lo que cada intento de obtener metadatos resultará con los datos anteriores. Además, WordPress (v5.7.2) no parece tener un gancho para después de guardar una publicación.
También, gancho ‘save_post’ es muy complicado porque se ejecuta para cada publicación guardada o creada, incluidas las revisiones, y el booleano $update aún no es lo suficientemente confiable.
david hilditch
La respuesta correcta y más simple es usar el wp_insert_post
acción.
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: el indicador $update te indica si se trata de una publicación nueva o actualizada.
do_action( 'wp_insert_post', int $post_ID, WP_Post $post, bool $update )
Entonces, para implementar su código después de que se hayan actualizado todos los metadatos de la publicación, use algo como esto:
add_action('wp_insert_post', 'run_after_post_updated', 10, 3);
function run_after_post_updated($post_ID, $post, $update ) {
// ...
}
-
A
wp_after_insert_post
hook está disponible desde la versión 5.6. Verifique esta respuesta: stackoverflow.com/a/71773904/1435770– Djanym
28 de abril a las 4:11
-
Claro, y está en la misma posición que wp_insert_post, excepto que es posible que wp_after_insert_post no se active, según los parámetros pasados a la función wp_insert_post. Ver i.imgur.com/Ou74dKy.png
– Dave Hilditch
4 de mayo a las 13:35
Mi trabajo para esto ha sido programar un trabajo cron para verificar el meta de la publicación unos 10 segundos después de que se haya actualizado la publicación. Todavía tengo que encontrar un gancho que pueda usar que me proporcione constantemente el objeto de publicación con el meta actualizado, el mismo problema que usted
– robobobobo
10 de julio de 2018 a las 11:32