Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Mise à jour des événements ultérieurs dans les publications du calendrier des événements

19

Il s’agit d’un cas très nuancé, mais j’ai pensé qu’il pourrait être utile d’essayer de généraliser un article pour toute personne susceptible de travailler sur des événements futurs avec le calendrier des événements de Modern Tribe.

Supposons que vous configuriez un événement récurrent et que, dans le corps de l’événement (ou, plus précisément, le post_content ), vous vouliez dire quelque chose comme :

Cela fait N ans que [cet événement] s’est produit.

Le fait est que chaque événement ultérieur sera évidemment supérieur d’un an à celui qui le précède. Vous ne pouvez donc pas nécessairement coder en dur la valeur dans les événements sans qu’elle soit placée dans le contenu de la publication de chaque événement.

Alors, quelle est une façon d’aborder cela?

Mise à jour des événements ultérieurs

Comme pour la plupart des choses, cela dépendra de la configuration de votre base de code, mais en supposant que vous travaillez avec des événements de série, ce n’est pas trop mal.

Pour ce post, je suppose :

  1. vous avez des événements configurés de telle manière que vous avez le premier événement d’une série, puis vous avez des événements suivants),
  2. vous êtes à l’aise pour exécuter des requêtes de base en utilisant $wpdb ,
  3. vous êtes à l’aise avec les expressions régulières de base,
  4. vous connaissez wp_update_post

Le processus général par lequel vous pouvez mettre à jour chaque événement pour refléter le bon nombre d’années dans son post_content ressemblera à ceci :

  1. en utilisant le premier événement de la série, trouver tous les messages suivants,
  2. localisez le numéro dans le post_content et incrémentez-le de un,
  3. mettre à jour le poste.

Assez simple, non? Voici comment procéder.

1 Rechercher des événements ultérieurs

Pour mettre à jour les événements suivants, il est important d’avoir l’ID de l’événement principal. Ceci est généralement facile à obtenir si vous avez déjà créé l’événement par programmation, car tribe_create_event renvoie l’ID de publication.

Sinon, vous pouvez faire quelque chose comme rechercher un message par son titre ou quelque chose de similaire. Et une fois que vous avez ce message, vous pouvez récupérer son identifiant.

Une fois cela fait, écrivez une requête rapide pour récupérer tous les messages avec l’ID de message initial comme parent :

<?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;
}

Évidemment, je préfère mettre cela dans sa fonction afin de pouvoir l’appeler à plusieurs endroits dans l’application, le déboguer au besoin et isoler sa responsabilité.

Vous souhaiterez peut-être renvoyer les résultats sous la forme d’une collection d’objets ou ajouter d’autres qualificatifs à la requête pour limiter le type de résultats renvoyés. Quoi qu’il en soit, le principal avantage de ce code est que vous récupérez les ID et post_content de tous les messages suivants d’une série en fonction de l’ID de l’événement initial.

2 Mettre à jour le contenu de la publication

Une fois les événements renvoyés, une boucle peut être configurée pour les parcourir. La manière dont vous définissez la boucle déterminera la manière dont vous configurez un compteur, mais l’une des manières les plus élémentaires de procéder consiste à :

  1. définir une valeur, à partir de un, que vous pouvez ajouter et incrémenter à chaque itération,
  2. ajoutez ceci au chiffre trouvé dans le message.

Donc, si vous deviez utiliser une  boucle foreach, le code pourrait ressembler à ceci :

<?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.
  }
}

Ce sera un peu plus compliqué si vous avez plusieurs chiffres dans le corps de votre post, mais cela suffit pour donner une idée de comment travailler avec au moins un (comme dans l’exemple en haut du post).

3 Mettre à jour la publication

Enfin, une fois le post_content mis à jour, il suffit d’appeler une API WordPress pour mettre à jour le contenu du post.

<?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'],
    ));
  }
}

Bien sûr, comme mentionné tout au long de l’article, votre code peut sembler différent, les aspects de performance peuvent être différents ou nécessiter d’autres considérations (que je couvrirai momentanément).

Mais, si rien d’autre, c’est au moins un point de départ.

autres considérations

Il peut y avoir des moments où le contenu de la publication contient plusieurs numéros, ou il peut y avoir des moments où il peut y avoir des milliers d’événements ultérieurs. Dans chacun de ces cas, l’approche ci-dessus peut ne pas convenir.

Autrement dit, vous pouvez toujours suivre ces étapes, mais elles ne sont peut-être pas les plus performantes telles qu’elles sont écrites. Dans ce cas, vous devrez peut-être configurer un traitement par lots pour le gérer ou le faire pendant les heures creuses en utilisant une tâche cron, ou l’une des nombreuses autres façons de résoudre le problème.

Les approches susmentionnées sortent du cadre de cet article, mais l’approche en trois étapes reste la même. Il s’agit plus de diviser pour régner pour s’attaquer au problème que de savoir comment le faire.

Source d’enregistrement: 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