✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Actualización de eventos subsiguientes en publicaciones del calendario de eventos

13

Este es un caso realmente matizado, pero pensé que podría valer la pena tratar de generalizar para una publicación para cualquier persona que pueda estar trabajando con eventos futuros con el Calendario de eventos de Modern Tribe.

Digamos que está configurando un evento recurrente y dentro del cuerpo del evento (o, más apropiadamente, post_content) quiere decir algo como:

Han pasado N años desde que ocurrió [este evento].

La cuestión es que cada evento subsiguiente obviamente será un año mayor que el anterior. Por lo tanto, no necesariamente puede codificar el valor en los eventos sin que se coloque en el contenido de la publicación de cada evento.

Entonces, ¿cuál es una forma de abordar esto?

Actualización de eventos posteriores

Como con la mayoría de las cosas, esto dependerá de cómo esté configurado su código base, pero asumiendo que está trabajando con eventos de series, no es tan malo.

Para esta publicación, asumo:

  1. tiene eventos configurados de tal manera que tiene el primer evento de una serie y luego tiene eventos posteriores),
  2. te sientes cómodo ejecutando consultas básicas usando $wpdb ,
  3. te sientes cómodo con las expresiones regulares básicas,
  4. estás familiarizado con wp_update_post

El proceso general mediante el cual puede actualizar cada evento para reflejar la cantidad adecuada de años dentro de su post_content será algo así:

  1. utilizando el primer evento de la serie, busque todas las publicaciones posteriores,
  2. localice el número en post_content e increméntelo en uno,
  3. actualice la publicación.

Bastante sencillo, ¿verdad? Aquí está cómo hacerlo.

1 Buscar eventos posteriores

Para actualizar eventos posteriores, es importante tener el ID del evento principal. Por lo general, esto es fácil de obtener si ya ha creado el evento mediante programación porque tribe_create_event devuelve el ID de la publicación.

De lo contrario, puede hacer algo como encontrar una publicación por su título o algo similar. Y una vez que tenga esa publicación, puede obtener su ID.

Una vez hecho esto, escriba una consulta rápida para recuperar todas las publicaciones con el ID de publicación inicial como principal :

<?php

private function find_all_events( $event_id) {

  global $wpdb;
  $events = $wpdb->get_results(
    $wpdb->prepare("
      SELECT ID, post_content
      FROM   $wpdb->posts
      WHERE  post_parent = '%d'
      AND    post_status = 'publish'
    ", $event_id),
    ARRAY_A
  );

  return $events;
}

Obviamente, prefiero poner esto en su función para poder llamarlo en varios lugares de la aplicación, depurarlo según sea necesario y aislar su responsabilidad.

Es posible que desee devolver los resultados como una colección de objetos o agregar más calificadores a la consulta para limitar el tipo de resultados que se devuelven. De todos modos, la conclusión principal de este código es que está tomando los ID y post_content de todas las publicaciones posteriores en una serie en función del ID del evento inicial.

2 Actualizar el contenido de la publicación

Una vez que se han devuelto los eventos, se puede configurar un bucle para recorrerlos en iteración. Dependiendo de cómo defina el bucle, determinará cómo configurar un contador, pero una de las formas más básicas de hacerlo es:

  1. defina un valor, comenzando en uno, que puede agregar e incrementar durante cada iteración,
  2. agregue esto al dígito que se encuentra en la publicación.

Entonces, si tuviera que usar un  bucle foreach, el código podría verse así :

<?php

public function update_future_events( $event_id) {

  $events = $this->find_all_events( $event_id );

  $iteration = 1;
  foreach ($events as $event) {

    preg_match_all( '/(d+)/', $anniversary['post_content'], $matches );

    $original_year = $matches[0];
    $original_year = intval( $original_year[0] );
    $new_year      = ($original_year + $iteration );
    $iteration++;

    // See forth-coming gist.
  }
}

Esto será un poco más complicado si tiene varios dígitos en el cuerpo de su publicación, pero esto es suficiente para dar una idea de cómo trabajar con al menos uno (como en el ejemplo en la parte superior de la publicación).

3 Actualizar la publicación

Finalmente, una vez que se ha actualizado post_content, se trata de simplemente llamar a una API de WordPress para actualizar el contenido de la publicación.

<?php

public function update_future_events( $event_id) {

  $events = $this->find_all_events( $event_id );

  $iteration = 1;
  foreach ($events as $event) {

    // See previous gist.

    $event['post_content'] = str_ireplace( $original_year, $new_year, $event['post_content'] );
    wp_update_post(array(
      'ID'           => $event['ID'],
      'post_content' => $event['post_content'],
    ));
  }
}

Por supuesto, como se menciona a lo largo de la publicación, su código puede verse diferente, los aspectos de rendimiento de esto pueden ser diferentes o requerir algunas otras consideraciones (que cubriré momentáneamente).

Pero, si nada más, esto es al menos un punto de partida.

Otras Consideraciones

Puede haber momentos en los que el contenido de la publicación contenga varios números, o puede haber momentos en los que puede haber miles de eventos posteriores. En cada uno de estos casos, el enfoque anterior puede no ser el adecuado.

Es decir, aún puede seguir estos pasos, pero es posible que no sean los más eficaces tal como están escritos. En ese caso, es posible que deba configurar un proceso por lotes para manejarlo o hacerlo fuera del horario laboral mediante un trabajo cron, o una de varias otras formas de abordar el problema.

Los enfoques antes mencionados están más allá del alcance de esta publicación, pero el enfoque de tres pasos sigue siendo el mismo. Se trata más de dividir y vencer para abordar el problema que de cómo se hace.

Fuente de grabación: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More