web-dev-qa-db-fra.com

Ajouter une nouvelle publication avec une date prédéfinie/prédéfinie

La situation présente

Le plugin sur lequel je travaille actuellement est une vue supplémentaire de la liste des publications: un calendrier, comme vous pouvez le voir sur la capture d'écran suivante.

Admin Calendar View

Affichage du calendrier administrateur avec MP6 et largeur de l'écran de poche.

Le but

Désormais, chaque jour indique uniquement le nombre de messages.

Ce que je veux ajouter, c'est un lien pour ajouter un nouveau message . Mais ce lien devrait non seulement vous amener à l'écran ~/wp-admin/post-new.php?post_type=abc, mais aussi ajouter une date de publication prédéfinie - celui du jour où vous avez cliqué.

Les solutions possibles et les problèmes

Jusqu'à présent, il y a plusieurs options:

  1. Accédez à la méta-boîte de publication et essayez de modifier la date d'une manière ou d'une autre.
  2. Supprimez la boîte méta, faites-en un clone et remplacez simplement la date pour accepter les données d'une variable de requête (@Rarst idea).
  3. Ajoutez un brouillon avec un statut de post personnalisé et une date prédéfinie en cliquant sur le lien "nouveau", rediriger vers le brouillon. Nettoyez les brouillons avec un travail wp cron (idée de @userabuser).

Les problèmes

  1. Accrocher dans la boîte méta signifie ajouter un rappel au filtre preview_post_link-. Ensuite, j'attache un autre rappel pour intercepter l'option gmt_offset- avec un filtre 'pre_option_gmt_offset'- simplement pour modifier le calcul effectué dans touch_time() pour renvoyer la date actuelle. Le problème est que le calcul est time() + ( $offset * HOURS_IN_SECONDS ); et que la seule valeur que l’on pourrait changer est $offset.
  2. Remplacer la méta-boîte signifierait garder une trace de chaque ticket de traçage et de chaque changement fondamental et ne serait donc pas une preuve de l'avenir.
  3. Beaucoup d'efforts sont déployés pour ajouter des brouillons, les nettoyer, etc. Il existe également un problème: l'utilisation du statut de publication personnalisé reste un champ rempli de pièges à mines.

Toute idée appréciée. Code qui prouve le concept encore plus. J'annoncerai une prime dès qu'il y aura quelques brouillons utilisables comme réponses.

1
kaiser

Je pense que la meilleure solution, comme indiqué dans le chat, est le point 3, qui consiste à ajouter par programme un brouillon (ou un statut de message personnalisé) via l'utilisation de wp_insert_post où, parmi d'autres paramètres, vous pouvez définir des préférences;

  'post_date'      => [ Y-m-d H:i:s ] //The time post was made.
  'post_date_gmt'  => [ Y-m-d H:i:s ] //The time post was made, in GMT.

... sans avoir à intercepter gmt_offset via pre_option_gmt_offset qui est de toute façon une impasse.

Remplacer également la méta-boîte de publication, le cloner, le reconstruire, quelle que soit la manière dont vous voulez le dire - est potentiellement désastreux entretien cauchemar .

Si nous y réfléchissons, l’ajout d’un brouillon (ou du statut de publication personnalisé de votre choix) est bien moins gênant que les idées susmentionnées.

Le seul inconvénient de wp_insert_post est que nous insérons physiquement une publication dans la base de données. Par conséquent, à certains égards, nous polluons la base de données avec ce qui serait normalement un brouillon automatique.

C'est là que wp_cron entre en jeu.

Comme vous l'avez mentionné dans le chat, vous pouvez vouloir ajouter un champ personnalisé (préfixé avec un trait de soulignement) pour marquer ces entrées de publication, selon que vous vous en teniez ou non au statut de la publication draft.

SI l'utilisateur ne publie pas , nous pouvons considérer que cet article a été ignoré et qu'il doit donc être marqué pour nettoyage.

J'irais même jusqu'à ajouter un avis d'administrateur personnalisé qui indique à l'utilisateur que s'il ne publie pas l'article, il ne sera pas ajouté à l'agenda en tant qu'entrée et sera affecté au nettoyage à une date ultérieure.

C’est la solution la plus sûre, la plus saine et la plus durable qui soit jusqu’à ce que nous obtenions (le cas échéant) la possibilité de définir par programme les entrées de formulaire sur l’écran de post-édition via des variables de requête autres que (post_title/content/excerpt), qui semblent être les seules à fonctionner actuellement.

La seule autre option à laquelle je puisse penser serait de définir la valeur des entrées de date via JavaScript et/ou jQuery - ce qui serait facile à faire, mais vous n'avez aucune garantie que l'utilisateur a activé JavaScript, ce qui si ce n'est pas le cas - ceci échouerait.

Nous savons qu'il existe des cas Edge pour le statut de publication personnalisée qui pourraient être préoccupants, mais compte tenu de leur utilisation dans votre application, je pense que le risque est minime de les utiliser.

1
userabuser