En realidad se podría hacer incluso con javascript, o sea que cuando se publica por primera vez un articulo, entonce se lanza automáticamente un javascript que yo añado en una textarea en la configuración del plugin
he visto plugin que permiten añadir javascript a las paginas y posts, pero esto no me sirven porqué es como añadir un javascript que siempre se ejecuta cada vez se abre la página.
Programando un poco se puede, claro… Pero quizá te valga algo del tipo IFTT (hay cosas, no exactamente lo que necesitas: https://ifttt.com/wordpress), o Zapier (https://zapier.com/apps/wordpress/integrations)
No he usado Integromat, pero creo que te puede dar incluso más flexibilidad… https://www.integromat.com/en/templates/wordpress
Gracias por los enlaces. Me los voy a mirar.
También estaba pensando de utilizar un plugin de lista de correo donde voy a inscribir solo una dirección email (la del servidor), así cuando se publica un articulo, wordpress envía un correo a esa cuenta (que está en el mismo servidor, así que la llegada es instantánea)
Luego creo un daemon que vigila el tamaño del fichero de la cuenta de correo, cada 5 segundos, y si eso cambia, entonce se lanza un fetchmail que analiza el mensaje, saca el asunto, el enlace, y lanza el servicio de mensajes push para todos las apps.
De esta forma cuando tengo que actualizar no tengo que hacer ninguna manutención en el código de WP y sus plugins. Simplemnte pulso botones y ya me olvido de WP.
creo que podría funcionar.
No se si termino de pillar el problema, pero el action transition_post_status
que has mencionado lo veo idóneo para este use case, ¿no? ¿por qué no te vale?
add_action( 'transition_post_status', 'cyb_push_notification', 10, 3 );
function cyb_push_notification( $new_status, $old_status, $post ) {
// Prueba la combinación de $new_status y $old_status
// que te interese
if( 'publish' === $old_status ) return;
if( 'publish' !== $new_status ) return;
$request_args['headers'] = [
'Authorization' => 'key=<SERVER KEY>',
'Content-Type' => 'application/json'
];
$request_args['body'] = [
//....
];
// wp_remote_post() utiliza cURL si está disponible
// Ver https://developer.wordpress.org/reference/functions/wp_remote_post/
// Ver https://developer.wordpress.org/reference/functions/wp_remote_request/
$response = wp_remote_post(
'https://fcm.googleapis.com/fcm/send',
$request_args
);
if( is_wp_error( $response ) ) {
error_log( $response->get_error_message() );
}
}
Ahora me centro en el detalle de «la primera vez que se publique». Entiendo que si un post fue publicado, luego despublicado y luego publicado otra vez, entonces no quieres hacer el push de nuevo. Se me ocurre, por ejemplo, utilizar un custom field:
add_action( 'transition_post_status', 'cyb_push_notification', 10, 3 );
function cyb_push_notification( $new_status, $old_status, $post ) {
// Si la notificación para este post ya se envió ...
if( '1' == get_post_meta( $post->ID, 'notification_sent' , true ) ) return;
$request_args = [
// ....
]
$response = wp_remote_post(
'https://fcm.googleapis.com/fcm/send',
$request_args
);
if( is_wp_error( $response ) ) {
error_log( $response->get_error_message() );
} else {
update_post_meta( $post->ID, 'notification_sent', '1' );
}
}
Algo así creo que podría servirte.
muy interesante, de verdad!
Pero hay una forma para proteger este código desde una actualización de WP?
algo como los child-themes pero para el núcleo?
Unas reglas que suelo seguir (no tienen por qué ser ciertas e inmutables, pero de momento las sigo a rajatabla):
– Nunca, bajo ningún concepto, modifiques archivos de WordPress
– Casi nunca, casi bajo ningún concepto, pongas en los themes código/funciones que no sean para el «look & feel». Si no es diseño/maquetación, utiliza un plugin.
Ese código lo puedes convertir en un plugin con unas pocas líneas, y será independiente de la actualización de WordPress e independiente de la actualización del theme. Es más, seguirás teniendo esa funcionalidad aunque cambies de theme.
<?php
/*
Plugin Name: Send push notifications
Plugin URI: https://es.wordpress.org/support/topic/plugin-que-lanze-una-accion-hook-despues-de-publicar-un-post-la-primera-vez/
Description: A plugin to send notifications through Firebase
Version: 0.1
Author: Juan Padial (@CybMeta)
*/
add_action( 'transition_post_status', 'cyb_push_notification', 10, 3 );
function cyb_push_notification( $new_status, $old_status, $post ) {
// Si la notificación para este post ya se envió ...
if( '1' == get_post_meta( $post->ID, 'notification_sent' , true ) ) return;
$request_args = [
// ....
]
$response = wp_remote_post(
'https://fcm.googleapis.com/fcm/send',
$request_args
);
if( is_wp_error( $response ) ) {
error_log( $response->get_error_message() );
} else {
update_post_meta( $post->ID, 'notification_sent', '1' );
}
}
A parte de los custom fields, igual se podría investigar hacerlo con el Options API y un cron job (1, 2), pero bueno, la idea base viene a ser la misma.
Espero que te sirva. Saludos!!