Obtenha quantos dias desde o último post do usuário atual

2

Como obtenho há quanto tempo a última postagem publicada do usuário atual? Por exemplo:

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

Eu preciso usar esse número em uma variável para um plug-in que estou desenvolvendo.

Estou procurando uma solução com o desempenho em mente.

    
por Mark 12.11.2013 / 17:27

2 respostas

5

Você pode usar uma versão modificada de isto responda por @s_ha_dum .

Onde, em vez de uma opção, você pode configurar uma meta de usuário (mesmo que a meta-consulta seja mais lenta que a consulta de opção)

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

Desta forma, você salva na meta do usuário o registro de data e hora da última edição.

Agora você pode escrever uma função para retornar os dias desde a última edição

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

retorno da função false se nenhum usuário estiver logado e retornar -1 se o usuário nunca tiver publicado uma postagem.

A consulta executada é mais simples, há menos trabalho que o PHP faz e o resultado também é armazenado em cache.

Isso só entrará em vigor para os usuários depois que eles publicarem uma nova postagem, para que todos os usuários sejam iniciados em branco, mas você pode escrever uma função que seja executada apenas uma vez para configurar todas as meta de usuário.

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 função é executada apenas uma vez quando você entra no backend (para evitar que o frontend fique lento). Esta é uma função muito lenta , por isso, depois de adicionar functions.php na primeira vez que abrir o painel, levará alguns segundos ... Esta função é executada uma vez, mas provavelmente é melhor se você remover (ou comentar) depois de ter feito o seu trabalho.

    
por gmazzap 12.11.2013 / 18:17
2

Parece que você está procurando por get_most_recent_post_of_user() enlace

Na função do seu 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);
    }

Em seguida, use:

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

    
por David Kryzaniak 12.11.2013 / 18:04

Tags