web-dev-qa-db-fra.com

Orderby Post Vues

Je souhaite créer une liste de filtres pour mes publications (dans les pages d'accueil, de recherche et d'archives) Voici un exemple de ce que je recherche.

Trier par: - Date (/? Orderby = date) - Aléatoire (/? Orderby = Rand) - Vues (ici, j'ai besoin d'un ordreby = vues ou quelque chose comme ça)

Je compte et visualise les vues des publications à l'aide de ce code:

// Count views
function setPostViews($postID) {
  $count_key = 'post_views_count';
  $count = get_post_meta($postID, $count_key, true);
  if($count=='') {
    $count = 0;
    delete_post_meta($postID, $count_key);
    add_post_meta($postID, $count_key, '0');
  } else {
    $count++;
    update_post_meta($postID, $count_key, $count);
  }
}

// Show views
function getPostViews($postID) {
  $count_key = 'post_views_count';
  $count = get_post_meta($postID, $count_key, true);
  if($count=='') {
    delete_post_meta($postID, $count_key);
    add_post_meta($postID, $count_key, '0');
    return "0 View";
  }
  return $count.' Views';
}

// Show views in WP-Admin
add_filter('manage_posts_columns', 'posts_column_views');
add_action('manage_posts_custom_column', 'posts_custom_column_views', 5, 2);
function posts_column_views($defaults) {
  $defaults['post_views'] = __('Views');
  return $defaults;
}
function posts_custom_column_views($column_name, $id){
  if($column_name === 'post_views') {
    echo getPostViews(get_the_ID());
  }
}

Est-ce possible?

2
Hank Scorpio

Vous pouvez trier votre requête par numéro d'affichage à l'aide de la clé méta:

$query = new WP_Query( 
            array( 
                'meta_key' => 'post_views_count',
                'orderby' => 'meta_value_num',
                'order' => 'DESC',
            ) 
        );

Cela interrogera vos messages en fonction des vues. Vous pouvez changer DESC en ASC ou Rand pour obtenir ce que vous avez demandé.

Pour que cela fonctionne, vous pouvez utiliser pre_get_posts() pour filtrer votre requête. Utilisez ce code de pièce dans le fichier functions.php de votre thème:

add_action( 'pre_get_posts', 'my_view_filter' );
function my_view_filter($query){
    if ( 
        !is_admin() && 
        $query->is_main_query() && 
        ( $query->is_home() || $query->is_archive() || $query->is_search() )
    ) {
        if (isset($_REQUEST['orderby'])) {
            $order = $_REQUEST['orderby'];
        }
        if ( $order === 'views') {
            $query->set('meta_key', 'post_views_count');
            $query->set('orderby', 'meta_value_num');
            $query->set('order', 'DESC');
        }
    }
}

Maintenant, chaque fois que vous visiterez http://example.com/?orderby=views, vos publications seront filtrées par le nombre de vues (décroissant, vous pouvez le changer à votre guise)

2
Jack Johansson