Comment empêcher la publication de messages trop proches les uns des autres?

9

Je gère un blog composé d'environ 25 écrivains. Parfois, certains d'entre eux sont en train d'écrire un nouveau message à la fois, et ils finissent par les publier trop près les uns des autres.

Existe-t-il un moyen d'empêcher que cela se produise? Quelque chose à dire "Un autre message vient d'être mis en ligne au cours des 5 dernières minutes. Vous devrez attendre 55 minutes pour publier le vôtre."

Tam N.
la source
3
J'ai pris la liberté de modifier légèrement la question, ce n'est donc pas une recommandation explicite de plugin (hors sujet selon la FAQ ). S'il y a un plugin, quelqu'un le recommandera. Vous en avez cherché un? Je pense qu'une solution personnalisée sera nécessaire. Avez-vous fait des recherches sur ce site?
brasofilo
@brasofilo +1 ... aZn137 (est-ce votre mot de passe?), vous voudrez peut-être vous connecter à pre_save_postou save_post. Pouvez-vous nous montrer quelques recherches sur ce que vous avez essayé jusqu'à présent (en dehors de l'installation de plugins).
kaiser
Oui, j'ai passé un peu de temps sur Google, mais je n'ai trouvé aucun plugin qui ferait ce genre de truc. Je pourrai peut-être préparer mon propre crochet. J'examinerai pre_save_post et save_post. Merci les gars.
Tam N.

Réponses:

8

Voici un bloc de code très approximatif qui devrait vous aider à démarrer. Il recherche la publication "future" ou "publier" la plus récente et si cette valeur est inférieure à 1 heure par rapport à la dernière publication planifiée, il planifie la publication actuelle à une heure plus l'heure "la plus récente" trouvée.

function force_time_between_posts_wpse_104677($data, $postarr) {
  global $wpdb;
  if (empty($postarr['ID'])) return $data;

  $latest = $wpdb->get_var("
    SELECT post_date
    FROM {$wpdb->posts} 
    WHERE post_status IN('future','publish') 
    AND post_type = 'post' 
    AND ID != {$postarr['ID']}
    ORDER BY post_date DESC
    LIMIT 1");
  $distance = 60; // post publication spacing in minutes
  $latest = strtotime($latest);
  $current = strtotime($data['post_date']);

  if ($latest < $current) {
    $diff = $current - $latest;
  } else { 
    $diff = 0;
  }

  if ($diff >= 0 && $diff < ($distance * 60)) {
    $new_date = $latest + ($distance * 60);
    $date = date('Y-m-d H:i:s',$new_date);
    $date_gmt = get_gmt_from_date($date);
    $data['post_date'] = $date;
    $data['post_date_gmt'] = $date_gmt;
    $data['post_status'] = 'future';
  }
  return $data;
}
add_action('wp_insert_post_data','force_time_between_posts_wpse_104677',1,2);

En fait, cela force la planification de la publication, et s'il existe déjà une publication future, la suivante sera programmée après cette publication déjà programmée. Cela signifie qu'il pourrait éventuellement planifier des publications dans le futur.

Vous voudrez peut-être exempter certains rôles de cette planification de publication, ou l'exiger uniquement pour un seul rôle, juste pour aider à garder les choses gérables.

s_ha_dum
la source
Merci beaucoup! J'ai continué et collé l'extrait dans mon fichier function.php qui se trouve sur mon blog de développement. Cela fonctionne parfaitement. J'ai d'abord publié un post # 1, puis j'ai fait un deuxième post # 2 juste après. Lorsque j'ai cliqué sur le bouton "Publier", la publication a été programmée pour 60 minutes à partir de la publication de la publication n ° 1. Je l'ai testé avec un autre post # 3, le paramétrant pour qu'il soit mis en ligne entre le post # 1 et le # 2, il l'a automatiquement remis à 1 heure après le post # 2. C'est parfait. Merci beaucoup!
Tam N.
Hmmm ... donc il y a un bug. Il saisit toujours le dernier message prévu comme base de comparaison. Disons que le post # 3 est prévu pour 24 heures. Lorsque je programme le post # 4 pour qu'il soit mis en ligne dans 12 heures, il fixe toujours l'heure à 1 heure après le post # 3. Cela dit, c'est bon pour moi de continuer. Merci quand même!
Tam N.
1
Pas un bug. Je l'ai expliqué dans la réponse. Ce n'est peut-être pas la logique que vous voulez, mais ce n'est pas un bug. Si vous ne le faites pas, les articles publiés à une minute d'intervalle publieraient toujours à une minute d'intervalle, bien que (peut-être) retardés d'une heure.
s_ha_dum
Je t'ai eu. Je suppose que je n'ai besoin que de messages qui seront mis en ligne immédiatement, pas ceux qui sont programmés. Si je modifiais l'extrait pour l'avoir WHERE post_status IN('publish'), je pense qu'il fonctionnerait mieux pour ce dont j'ai besoin.
Tam N.
1
Vous pouvez essayer cela, mais pensez à ce qui se passe lorsque plusieurs articles sont publiés. Ils seront tous programmés en fonction du dernier article publié - probablement le même article -, ce qui signifie que lorsqu'ils publieront, ils publieront toujours la même distance dans le temps comme ils l'auraient si vous ne faisiez rien. Ils seraient juste publiés une heure plus tard.
s_ha_dum
0

Il y a un plugin dans le référentiel nommé Auto Future Date qui fait quelque chose comme ça. Il n'a pas été mis à jour depuis un certain temps, mais la plupart du code semble assez utile.

Je ne l'ai pas testé, mais les captures d'écran donnent l'impression que vous pouvez toujours publier directement le message et ne pas coller save_postautomatiquement au crochet. Faire fonctionner ce code avec les bons crochets devrait faire l'affaire.

Coen Jacobs
la source