Soporte » Plugins y Hacks » plugin que lanze una accion hook después de publicar un post la primera vez

  • Hola a todos,

    me he escrito un servicio push con google firebase FCM, en mi servidor, que al recibir una petición https con curl, envía un mensaje push a las apps registradas en mi base de datos.
    Me he escrito también un simple blog en cgi, para testear el servicio y funciona perfectamente.

    Ahora me gustaría poder utilizar un blog de verdad y conectarlo a mi servicio push, pero para hacer eso se tendría que disparar un hook tipo transition_post_status después que se publique por la primera vez un articulo, y luego lanze php curl con algo parecido a esto:

    curl -X POST --header "Authorization: key=<SERVER KEY>" \
        --Header "Content-Type: application/json" \
        https://fcm.googleapis.com/fcm/send \
        -d "{\"to\":\"<FCM TOKEN>\",\"notification\":{\"body\":\"ENTER YOUR MESSAGE HERE\"}"

    Supongo que podría modificar wordpress para hacer esto, pero luego tendría que mantenerlo y esto me consumaría mucho tiempo, en cambio estoy casi seguro que alguien ya ha escrito un plugin para el manejo de los hooks de wp donde crear acciones.

    Agúnas ideas?

    si alguien está interesado al mundo de los mensajes push en android y ios, aquí una pista:
    https://android.jlelse.eu/firebase-push-notification-using-curl-command-devoid-backend-e63795d282c4

    saludos
    MaX

Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • Iniciador del debate maxlinux2000

    (@maxlinux2000)

    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

    Iniciador del debate maxlinux2000

    (@maxlinux2000)

    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.

    Iniciador del debate maxlinux2000

    (@maxlinux2000)

    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!!

Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • El debate ‘plugin que lanze una accion hook después de publicar un post la primera vez’ está cerrado a nuevas respuestas.