Como impedir que as postagens sejam publicadas muito próximas umas das outras?

9

Eu gerencio um blog que consiste em cerca de 25 escritores. Às vezes, alguns deles estão escrevendo um novo post de uma só vez e acabam publicando-os muito perto um do outro.

Tem algum jeito de prevenir que isso aconteça? Algo a dizer "Outra postagem foi lançada nos últimos 5 minutos. Você precisará aguardar 55 minutos para publicar a sua."

Tam N.
fonte
3
Tomei a liberdade de modificar um pouco a pergunta, por isso não é uma recomendação explícita de plug-in (fora do tópico de acordo com o FAQ ). Se houver um plugin, alguém irá recomendar. Você já procurou por um? Eu acho que uma solução personalizada será necessária. Você pesquisou este site?
brasofilo
@brasofilo +1 ... aZn137 (esta é sua senha?), você pode querer se conectar a pre_save_postou save_post. Você pode nos mostrar alguma pesquisa sobre o que você tentou até agora (além de instalar plug-ins).
kaiser
Sim, passei algum tempo pesquisando no Google, mas não encontrei nenhum plug-in que desse esse tipo de truque. Eu posso ser capaz de preparar meu próprio gancho. Vou examinar pre_save_post e save_post. Obrigado rapazes.
Tam N.

Respostas:

8

Aqui está um bloco muito difícil de código que deve ajudá-lo a começar. O que ele faz é procurar a postagem mais recente "futura" ou "publicar" e, se esse valor for menor que 1 hora diferente da última postagem agendada, ele agendará a postagem atual para uma hora mais o horário "mais recente" encontrado.

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

De fato, isso força o agendamento da postagem e, se já houver uma publicação futura, a próxima será agendada após a publicação já agendada. Isso significa que poderia potencialmente agendar postagens no futuro.

Convém isentar determinadas funções deste agendamento de postagem ou exigir apenas uma única função, apenas para ajudar a manter as coisas gerenciáveis.

s_ha_dum
fonte
Muito obrigado! Fui em frente e colei o trecho no meu arquivo function.php que está no meu blog de desenvolvimento. Funciona perfeitamente. Primeiro publiquei um post # 1, depois fiz um segundo post # 2 logo depois. Quando eu apertei o botão "Publicar", a postagem foi agendada para 60 minutos a partir do momento em que a postagem nº 1 foi lançada. Testei-o com outro post nº 3, configurando-o para ir ao ar entre o post nº 1 e o nº 2, e ele automaticamente voltou para 1 hora após o post nº 2. Isto é perfeito. Muito obrigado!
Tam N.
Hmmm ... então tem um bug. Ele sempre pega a última publicação programada como base para comparação. Digamos, a postagem nº 3 está programada para 24 horas. Quando eu agendar a postagem nº 4 para entrar em operação em 12 horas, ela sempre definirá o tempo para 1 hora após a postagem nº 3. Dito isto, é bom para eu continuar. Obrigado mesmo assim!
29713 Tam Tam
1
Não é um bug. Eu expliquei isso na resposta. Pode não ser a lógica que você deseja, mas não é um bug. Se você não fizer isso, as postagens publicadas com um minuto de diferença ainda serão publicadas com um minuto de diferença, embora (talvez) demorem uma hora.
s_ha_dum
Peguei vocês. Suponho que só preciso publicar postagens imediatamente, não agendadas. Se eu modificasse o snippet para ter WHERE post_status IN('publish'), acredito que funcionaria melhor para o que eu preciso.
Tam N.
1
Você pode tentar isso, mas pense no que acontece quando várias postagens são publicadas. Todos serão agendados com base na última publicação publicada - provavelmente a mesma publicação--, o que significa que, quando publicarem, ainda publicarão a mesma distância no tempo que teriam se você não fizesse nada. Eles seriam publicados uma hora depois.
s_ha_dum
0

Existe um plug-in no repositório chamado Auto Future Date que faz algo parecido com isto. Não foi atualizado por um bom tempo, mas a maior parte do código parece bastante útil.

Não testei, mas as capturas de tela fazem com que pareça que você ainda pode publicar diretamente a postagem e não se prender save_postautomaticamente. Fazer esse código funcionar com os ganchos certos deve fazer o truque.

Coen Jacobs
fonte