Obtener cuántos días desde la última publicación del usuario actual

2

¿Cómo obtengo el tiempo transcurrido desde la última publicación publicada del usuario actual? Por ejemplo:

It has been <?php echo $days_since_last_post; ?> days since your last post

Necesito usar ese número en una variable para un complemento que estoy desarrollando.

Estoy buscando una solución con el rendimiento en mente.

    
pregunta Mark 12.11.2013 - 17:27

2 respuestas

5

Puede usar una versión modificada de esta responde con @s_ha_dum .

Donde, en lugar de una opción, puede configurar un meta de usuario (incluso si la meta consulta es más lenta que la consulta de opción)

add_action('save_post', 'user_last_update', 10, 2);

function user_last_update($id, $p) {
  if (
      (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
      || (defined('DOING_AJAX') && DOING_AJAX)
      || ($p->post_status !== 'publish')
  ) {
    return;
  }
  update_user_meta( get_current_user_id(), 'last_update', time() );
}

De esta manera, guardará en el usuario la marca de tiempo de la última edición.

Ahora puede escribir una función para devolver los días desde la última edición

function user_last_edit(){
  $id = get_current_user_id();
  if ( ! $id ) return false;
  $recent = get_user_meta( $id, 'last_update', true );
  return $recent ? round( abs( time() - $recent ) / DAY_IN_SECONDS ) : -1;
}
La función

devuelve false si no hay un usuario registrado y devuelve -1 si el usuario nunca ha publicado una publicación.

La consulta realizada es más simple, hay menos trabajo que hace PHP y el resultado también se almacena en caché.

Esto solo estará vigente para los usuarios después de que publiquen una nueva publicación, por lo que todos los usuarios comenzarán en blanco, pero puede escribir una función que se ejecute solo una vez para configurar todos los metadatos del usuario.

function setup_last_edit() {
  if ( get_transient('setup_last_edit_done') ) return; // this function run once
  $users = get_users( array('fields'=> 'ID') );
  foreach ( $users as $userid ) {
     $args = array(
       'author' => $userid,
       'posts_per_page' => 1,
       'orderby' => 'date',
       'order' => 'DESC'
     );
     $posts = get_posts($args);
     if ( empty($posts) ) continue;
     $p = array_pop($posts);
     $last = mysql2date('U', $p->post_modified );
     update_user_meta( $userid, 'last_update', $last );
  }
  set_transient('setup_last_edit_done', 1);
}
add_action('admin_init', 'setup_last_edit');

Esta función se ejecuta solo una vez cuando se va al backend (para evitar la ralentización del frontend). Esta es una función muy lenta , por lo que después de agregarla en functions.php la primera vez que abra su panel de control, tardará unos segundos ... Esta función se ejecuta una vez, pero probablemente sea mejor si la elimina (o comenta) después de que haya realizado su trabajo.

    
respondido por el gmazzap 12.11.2013 - 18:17
2

Parece que estás buscando get_most_recent_post_of_user() enlace

En la función de tu tema.php

    days_since_last_post(){
        $recent = get_most_recent_post_of_user( get_current_user_id() );
        $start = strtotime($recent['post_date_gmt']);
        return ceil(abs(time() - $start) / 86400);
    }

Luego, usa:

It has been <?php echo days_since_last_post(); ?> days since your last post

    
respondido por el David Kryzaniak 12.11.2013 - 18:04

Lea otras preguntas en las etiquetas