$30 off During Our Annual Pro Sale. View Details »

Automatización en WordPress: Hooks & Cron

Automatización en WordPress: Hooks & Cron

Cómo hacer tareas programadas en WordPress cuando ocurren ciertos eventos o cuando pasa un tiempo definido. #cron #wp #wordpress #hook

Braulio Aquino

July 23, 2016
Tweet

More Decks by Braulio Aquino

Other Decks in Programming

Transcript

  1. Programando tareas en
    WordPress
    Hooks + Cron
    Sesión para el #WPPerú Meetup - Marzo, 2017
    @braulioaquino
    www.orange612.com

    View Slide

  2. Orange612.com
    Bach. Comp. Científica
    IV Dan de Taekwon-Do ITF
    Braulio Aquino

    View Slide


  3. Automatización
    Conjunto de procedimientos
    automáticos.

    View Slide

  4. ◉ Recibir un correo cuando una nueva entrada sea
    publicada.
    ◉ Aprobar nuevas entradas automáticamente X veces
    al día.
    ◉ Cambiar el rol de colaborador a autor a quienes
    tengan X publicaciones aprobadas.
    Automatización

    View Slide

  5. ◉ Cerrar comentarios de una entrada luego de X días
    de publicado.
    ◉ Validar registros por correo y autodescartar los que
    no hayan validado en X días.
    ◉ Cualquier orden por combinación de tiempo o acción.
    Automatización

    View Slide

  6. ¿Cómo se logran las
    tareas automáticas?

    View Slide

  7. Action hooks + Cron jobs +
    Programación pura y dura.

    View Slide


  8. Action hooks
    Algo que permite hacer algo
    cuando ocurre algo.

    View Slide


  9. Cron jobs
    Crean o ejecutan tareas
    programadas por tiempo.

    View Slide


  10. Programación pura y dura
    Code is poetry

    View Slide

  11. Action hooks

    View Slide

  12. Action hooks

    View Slide

  13. Action hooks

    Función a ejecutarse Cantidad de variables
    Prioridad
    Acción que ocurre

    View Slide

  14. Action hooks
    add_action('publish_post','o612_mail',10,2);
    function o612_mail( $ID, $post ) {
    $to = '[email protected]';
    $subject = $post->post_title . ' publicado';
    $msg = 'Ahora puedes visitar el artículo '.
    $post->post_title.' en '.get_permalink($ID);
    wp_mail( $to, $subject, $msg );
    }
    ?>

    View Slide

  15. Action hooks
    ◉ init
    ◉ wp_head
    ◉ wp_footer
    ◉ admin_init
    ◉ after_setup_theme
    ◉ template_redirect
    ◉ comment_post
    ◉ set_user_role
    ◉ admin_notices
    ◉ publish_post
    ◉ switch_theme
    ◉ delete_user
    ◉ password_reset
    ◉ add_meta_boxes

    View Slide

  16. Listado de acciones.
    codex.wordpress.org/Plugin_API/Action_Reference
    Action hooks

    View Slide

  17. Cron

    View Slide

  18. ◉ Se va a indicar a la computadora que ejecute una
    función cada tantos segundos.
    ◉ La indicación se tiene que dar una sola vez, de lo
    contrario se crearían varias órdenes.
    ◉ Cuando se deja de usar el cron este se tiene que
    eliminar.
    Cron

    View Slide

  19. Algoritmo:
    ◉ Si el cron no existe, lo creo.
    ◉ El cron indica que se ejecute un hook cada cierto
    tiempo.
    ◉ El hook va a invocar a nuestra función.
    Cron

    View Slide

  20. Action hooks
    if ( ! wp_next_scheduled('evento') ) {
    wp_schedule_event(
    time(),'intervalo','evento'
    );
    }
    add_action('evento','función');
    ?>

    View Slide

  21. Action hooks
    if ( ! wp_next_scheduled('evento') ) {
    wp_schedule_event(
    time(),'intervalo','evento'
    );
    }
    add_action('evento','función');
    ?>

    View Slide

  22. Action hooks
    if ( ! wp_next_scheduled('evento') ) {
    wp_schedule_event(
    time(),'intervalo','evento'
    );
    }
    add_action('evento','función');
    ?>

    View Slide

  23. Action hooks
    if ( ! wp_next_scheduled('evento') ) {
    wp_schedule_event(
    time(),'intervalo','evento'
    );
    }
    add_action('evento','función');
    ?>

    View Slide

  24. Action hooks
    if ( ! wp_next_scheduled('evento') ) {
    wp_schedule_event(
    time(),'intervalo','evento'
    );
    }
    add_action('evento','función');
    ?>

    View Slide

  25. Action hooks
    if ( ! wp_next_scheduled('evento') ) {
    wp_schedule_event(
    time(),'intervalo','evento'
    );
    }
    add_action('evento','función');
    ?>
    hourly
    twicedaily
    daily
    Personalizado

    View Slide

  26. Action hooks
    if ( ! wp_next_scheduled('evento') ) {
    wp_schedule_event(
    time(),'intervalo','evento'
    );
    }
    add_action('evento','función');
    ?>

    View Slide

  27. Action hooks
    if ( ! wp_next_scheduled('evento') ) {
    wp_schedule_event(
    time(),'intervalo','evento'
    );
    }
    add_action('evento','función');
    ?>

    View Slide

  28. Variables para crear un nuevo intervalo:
    ◉ El nombre clave del nuevo intervalo.
    ◉ El valor en segundos.
    ◉ El nombre común del intervalo.
    Cron

    View Slide

  29. Cron
    add_filter('cron_schedules','f_10_minutes');
    function f_10_minutes( $schedules ) {
    $schedules['ten_minutes'] = array(
    'interval' => 10*60,
    'display' => 'Cada 10 minutos'
    );
    return $schedules;
    }
    ?>

    View Slide

  30. Eliminar un cron que ya no es útil:
    Cron
    if ( wp_next_scheduled('evento') ) {
    wp_clear_scheduled_hook('evento');
    }
    ?>

    View Slide

  31. Ejemplos

    View Slide


  32. Hooks
    Recibir un correo cuando una nueva
    entrada sea publicada.

    View Slide

  33. add_action('publish_post','o612_mail',10,2);
    function o612_mail( $ID, $post ) {
    $subject = $post->post_title . ' publicado';
    $msg = 'Ahora puedes visitar el artículo '.
    $post->post_title.' en '.get_permalink($ID);
    $users = get_users('role=subscriber');
    foreach( $users as $user ) {
    wp_mail( $user->user_email, $subject, $msg );
    }
    }

    View Slide


  34. Cron
    Aprobar nuevas entradas
    automáticamente una vez al día.

    View Slide

  35. if ( !wp_next_scheduled('cron_day') ) {
    wp_schedule_event(time(),'daily','cron_day');
    }
    add_action('cron_day','daily_function');
    function daily_function() {
    global $wpdb;
    $id = $wpdb->get_var(
    "SELECT id FROM $wpdb->posts WHERE post_type='post'
    AND post_status='draft' ORDER BY rand() LIMIT 1"
    );
    wp_update_post(
    array('ID'=>$id,'post_status'=>'publish')
    );
    }

    View Slide


  36. Hook
    Cambiar el rol de colaborador a autor a
    quienes tengan X publicaciones aprobadas.

    View Slide

  37. ◉ Cada vez que el hook publish_post es llamado
    consultamos si el autor tiene rol contributor.
    ◉ Si cumple, preguntamos cuántos artículos tiene
    publicados.
    ◉ Si la cantidad de publicados es igual al número que
    elegimos, cambiamos el rol con
    wp_update_user(
    array('ID'=>$id, 'role'=>'author')
    );
    Algoritmo

    View Slide


  38. Cron
    Cerrar comentarios de una entrada luego
    de X días de publicado.

    View Slide

  39. ◉ Usar wp_schedule_event para un cron diario.
    ◉ Hacemos un query con los argumentos
    'comment_status' => 'open',
    'date_query' => array('column' => 'post_date',
    'after' => '- 30 days')
    ◉ Recorremos los resultados y en cada uno usamos
    wp_update_post(
    array('ID'=>$id,'comment_status'=>'closed')
    );
    Algoritmo

    View Slide


  40. Hook + Cron
    Validar registros por correo y autodescartar
    los que no hayan validado en X días.

    View Slide

  41. ◉ Cuando el hook user_register es llamado:
    ○ Con add_user_meta(); guardamos un campo con
    una clave random.
    ○ Enviar por mail al usuario un enlace a
    /algo/?codigo=id-claverandom
    ○ Al visitar el enlace dividimos $_GET['codigo'] y con
    get_user_meta($id,$clave,$single ); se valida o
    no al usuario.
    Algoritmo

    View Slide

  42. ◉ Mientras, cuando un cron diario es llamado:
    ○ Invocamos los ids de los usuarios no validados.
    ○ Revisamos la fecha de registro en cada usuario con
    get_userdata->user_registered
    ○ Si la fecha es superior a los días deseados enviamos
    un mail al usuario indicando que procedemos a
    cancelar el registro con wp_delete_user();
    Algoritmo

    View Slide

  43. Braulio Aquino
    ◉ orange612.com
    ◉ braulioaquino.com
    [email protected]
    ◉ speakerdeck.com/braulioaquino
    ¡Gracias!
    Automatización en WordPress - Sesión para el #WPPerú Meetup - Marzo, 2017 - Plantilla Viola de slidescarnival.com

    View Slide