Как предотвратить публикацию постов слишком близко друг к другу?

9

Я веду блог, который состоит из около 25 авторов. Иногда некоторые из них одновременно пишут новую статью, и в итоге они публикуют их слишком близко друг к другу.

Есть ли способ предотвратить это? Что-то, чтобы сказать: «За последние 5 минут только что вышло в свет другое сообщение. Вам нужно подождать 55 минут, чтобы опубликовать свое».

Там Н.
источник
3
Я позволил себе немного изменить Вопрос, так что это не явная рекомендация плагина (не по теме для часто задаваемых вопросов ). Если есть плагин, кто-то порекомендует. Вы искали один? Я думаю, что индивидуальное решение будет необходимо. Вы исследовали этот сайт?
brasofilo
@brasofilo +1 ... aZn137 (это ваш пароль?), вы можете подключиться pre_save_postили save_post. Можете ли вы показать нам некоторые исследования того, что вы пробовали до сих пор (кроме установки плагинов).
Кайзер
Да, я потратил некоторое время на поиски в Google, но не нашел ни одного плагина, который бы справился с этой задачей. Я могу приготовить свой крючок. Я посмотрю в pre_save_post и save_post. Спасибо, парни.
Там Н.

Ответы:

8

Вот очень грубый блок кода, который должен начать вас. Он ищет самую последнюю «будущую» или «опубликованную» публикацию, и если это значение отличается от последнего запланированного поста менее чем на 1 час, он планирует текущую запись на один час плюс «последнее найденное» время.

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);

Это делает фактически силой планирование поста, и если уже есть будущий выкладывают следующий будет назначены после этого уже запланированного поста. Это означает, что он может планировать публикации далеко в будущем.

Вы можете захотеть исключить определенные роли из этого пост-планирования или требовать его только для одной роли, просто чтобы помочь управлять вещами.

s_ha_dum
источник
Большое спасибо! Я добавил этот фрагмент в файл function.php, который находится в моем блоге по разработке. Работает отлично. Сначала я опубликовал пост № 1, затем сразу после этого сделал второй пост № 2. Когда я нажал кнопку «Опубликовать», пост был назначен на 60 минут с момента публикации поста №1. Я проверил это с другим постом № 3, настроив его на запуск между постами № 1 и № 2, он автоматически установил его обратно на 1 час после поста № 2. Это потрясающе. Большое спасибо!
Там Н.
Хм ... так что есть ошибка. Это всегда захватывает последний пост, который запланирован как база для сравнения. Скажем, пост № 3 запланирован на 24 часа. Когда я планирую запустить пост № 4 через 12 часов, он всегда устанавливает время на 1 час после поста № 3. Тем не менее, это хорошо для меня, чтобы продолжить. Спасибо, в любом случае!
Там Н.
1
Не ошибка Я объяснил это в ответе. Возможно, это не та логика, которая вам нужна, но это не ошибка. Если вы этого не сделаете, посты, опубликованные с интервалом в одну минуту, все равно будут публиковаться с интервалом в одну минуту, хотя (возможно) с задержкой на час.
s_ha_dum
Попался. Полагаю, мне нужны только посты, которые запускаются сразу, а не запланированные. Если бы я изменил фрагмент кода на наличие WHERE post_status IN('publish'), я считаю, что он будет работать лучше для того, что мне нужно.
Там Н.
1
Вы можете попробовать это, но подумайте о том, что происходит, когда публикуются несколько сообщений. Все они будут запланированы на основе последнего опубликованного поста - вероятно, того же самого поста - это означает, что, когда они публикуют, они все равно будут публиковать на том же расстоянии друг от друга, что и если бы вы ничего не сделали. Они будут опубликованы через час.
s_ha_dum
0

В репозитории есть плагин Auto Future Date, который делает что-то вроде этого. Он долгое время не обновлялся, но большая часть кода кажется довольно полезной.

Я не проверял это, но на скриншотах выглядело так, как будто вы все еще можете публиковать пост напрямую и не привязываться к нему save_postавтоматически. Заставить этот код работать с правильными хуками должен сделать свое дело.

Коэн Джейкобс
источник