¿Cómo evitar que las publicaciones se publiquen demasiado cerca una de la otra?

9

Administro un blog que consta de unos 25 escritores. A veces, algunos de ellos están en el proceso de escribir una nueva publicación a la vez, y terminan publicándolos demasiado cerca el uno del otro.

¿Hay alguna manera de evitar que esto suceda? Algo que decir "Otra publicación se publicó en los últimos 5 minutos. Tendrá que esperar 55 minutos para publicar la suya".

Tam N.
fuente
3
Me tomé la libertad de modificar ligeramente la pregunta, así que no es una recomendación explícita plug-in (fuera de tema por la FAQ ). Si hay un complemento, alguien lo recomendará. ¿Has buscado uno? Creo que será necesaria una solución personalizada. ¿Has investigado este sitio?
brasofilo
@brasofilo +1 ... aZn137 (¿es esta su contraseña?), es posible que desee conectar pre_save_posto save_post. ¿Puede mostrarnos alguna investigación de lo que ha intentado hasta ahora (aparte de instalar complementos)?
kaiser
Sí, he pasado algún tiempo buscando en Google, pero no he encontrado ningún complemento que haga este truco. Tal vez pueda cocinar mi propio anzuelo. Examinaré pre_save_post y save_post. Gracias chicos.
Tam N.

Respuestas:

8

Aquí hay un bloque de código muy aproximado que debería ayudarlo a comenzar. Lo que hace es buscar la publicación "futura" o "publicación" más reciente y si ese valor es menos de 1 hora diferente de la publicación programada más reciente, programa la publicación actual en una hora más el tiempo "más reciente" 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 hecho, esto fuerza la programación de publicaciones, y si ya hay una publicación futura, la siguiente se programará después de esa publicación ya programada. Eso significa que potencialmente podría programar publicaciones en el futuro.

Es posible que desee eximir ciertos roles de esta programación posterior, o solicitarlo solo para un solo rol, solo para ayudar a mantener las cosas manejables.

s_ha_dum
fuente
¡Muchas gracias! Seguí adelante y pegué el fragmento en mi archivo function.php que está en mi blog de desarrollo. Funciona perfectamente Primero publiqué una publicación # 1, luego hice una segunda publicación # 2 justo después de eso. Cuando presioné el botón "Publicar", la publicación estaba programada para 60 minutos desde que se publicó la publicación # 1. Lo probé con otra publicación n. ° 3, configurándolo para que se active entre la publicación n. ° 1 y la n. ° 2, lo configuró automáticamente a 1 hora después de la publicación n. ° 2. Esto es perfecto. ¡Muchas gracias!
Tam N.
Hmmm ... así que hay un error. Siempre toma la última publicación programada como base para comparar. Digamos que la publicación # 3 está programada para 24 horas. Cuando programo la publicación n. ° 4 para que se publique en 12 horas, siempre establecerá el tiempo en 1 hora después de la publicación n. ° 3. Dicho esto, esto es bueno para mí para continuar. ¡Gracias de cualquier manera!
Tam N.
1
No es un error Lo expliqué en la respuesta. Puede que no sea la lógica que desea, pero no es un error. Si no haces eso, las publicaciones publicadas con un minuto de diferencia aún se publicarían con un minuto de diferencia, aunque (tal vez) se retrasen por una hora.
s_ha_dum
Gotcha Supongo que solo necesito publicaciones que se publiquen de inmediato, no las programadas. Si modifico el fragmento a tener WHERE post_status IN('publish'), creo que funcionaría mejor para lo que necesito.
Tam N.
1
Puede intentarlo, pero piense en lo que sucede cuando se publican varias publicaciones. Todos se programarán en función de la última publicación publicada, probablemente la misma publicación, lo que significa que cuando publiquen aún publicarán la misma distancia en el tiempo que tendrían si no hicieran nada. Solo se publicarían una hora después.
s_ha_dum
0

Hay un complemento en el repositorio llamado Auto Future Date que hace algo como esto. No se ha actualizado durante bastante tiempo, pero la mayoría del código parece bastante útil.

No lo he probado, pero las capturas de pantalla hacen que parezca que todavía puedes publicar directamente la publicación y no quedarte save_postenganchado automáticamente. Hacer que este código funcione con los ganchos correctos debería ser el truco.

Coen Jacobs
fuente