web-dev-qa-db-fra.com

Posté le dernier jour

Comment obtenir combien de temps depuis le dernier message publié de l'utilisateur actuel? Par exemple:

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

Je dois utiliser ce nombre dans une variable pour un plugin que je développe.

Je recherche une solution axée sur la performance.

2
Mark

Vous pouvez utiliser une version modifiée de cette réponse par @ s_ha_dum .

Où au lieu d'une option, vous pouvez configurer une méta d'utilisateur (même si la méta-requête est plus lente que la requête d'option)

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 cette façon, vous enregistrez dans la méta de l'utilisateur l'horodatage de la dernière édition.

Maintenant, vous pouvez écrire une fonction pour renvoyer les jours depuis la dernière modification

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

function return false si aucun utilisateur n'est connecté et renvoie -1 si l'utilisateur n'a jamais publié d'article.

La requête effectuée est plus simple, il y a moins de travail que PHP fait et le résultat est également mis en cache.

Cela ne s'appliquera qu'aux utilisateurs après la publication d'un nouveau message. Tous les utilisateurs seront donc vides, mais vous pouvez écrire une fonction qui ne s'exécute qu'une seule fois pour configurer tous les méta de l'utilisateur.

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

Cette fonction est exécutée une seule fois lorsque vous passez en back-end (pour éviter le ralentissement du front-end). Ceci est une fonction très lente donc après avoir ajouté dans functions.php la première fois que vous ouvrez votre tableau de bord cela prendra quelques secondes ... Cette fonction est exécutée une fois, mais est probablement meilleure si vous supprimez ( ou commenter) après avoir accompli son travail.

5
gmazzap

On dirait que vous recherchez get_most_recent_post_of_user()http://codex.wordpress.org/Function_Reference/get_most_recent_post_of_user

Dans la fonction.php de votre thème

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

Ensuite, utilisez:

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

2
David Kryzaniak