【问题标题】:Wordpress order posts by custom meta in pagination分页中自定义元的Wordpress订单帖子
【发布时间】:2012-02-22 20:42:54
【问题描述】:

我正在按名为“size”的自定义元值对帖子进行排序。

$querystr = "
    SELECT $wpdb->posts.* 
    FROM $wpdb->posts, $wpdb->postmeta
    WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 
    AND $wpdb->postmeta.meta_key = 'size'
    AND $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post'
    AND $wpdb->posts.post_date < NOW()
    ORDER BY $wpdb->postmeta.meta_value DESC
 ";

 $pageposts = $wpdb->get_results($querystr, OBJECT);

if ($pageposts):
  global $post; 
  foreach ($pageposts as $post):      
  setup_postdata($post);     
      the_title();      
  endforeach;    
endif; 

wp_pagenavi(); //creates page navigation

同时,我正在使用 WP-pagenavi 插件按页面导航帖子。我每页有 10 个帖子。

问题:每个页面中的帖子都是单独排序的。如何在所有页面中按降序排列帖子?

更新:我可能已经找到了解决方案,但我不确定如何在我的代码中实现它

http://scribu.net/wordpress/wp-pagenavi/wpn-2-74.html

$my_query = new WP_Query( array( 'tag' => 'foo', 'paged' => get_query_var('paged') ) );

while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
    // more stuff here
endwhile;

wp_pagenavi( array( 'query' => $my_query ) );

wp_reset_postdata();    // avoid errors further down the page

【问题讨论】:

  • 如何以及在哪里按页面过滤结果?
  • 你的意思是LIMITphp.about.com/od/mysqlcommands/g/Limit_sql.htm我不太清楚你的意思。
  • @Artimuz,它被Wordpress中的WP-pagenavi插件过滤
  • @Sietse, no LIMIT 用于有效的分页。我正在尝试按所有页面的降序排列帖子,而不是现在正在发生的每个页面。
  • 我没有尝试过 WP_Pagenavi 插件,但据我了解,它不会为您过滤结果。根据this link,您必须编写一个处理page 查询变量的请求...

标签: php wordpress custom-fields


【解决方案1】:

我找到了一个可以解决您问题的 SO 帖子:

How to sort a 'query_posts' function by custom field, while limiting posts by another custom field

您会发现一个自定义类扩展 WP_Query 并允许您进行按自定义字段排序的查询,并包括 paged 查询变量。

所以步骤:

  1. class PostsOrderedByMetaQuery 代码放在functions.php 中的某处

  2. 将您的查询替换为:

    // Retrieve `paged` in URL
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    
    // Make the query like in WP_Query but with our custom class
    $query = new PostsOrderedByMetaQuery(array(
      'post_type'   => 'post',
      'post_status' => 'publish',
      'paged'       => $paged,
      'orderby_meta_key' => 'size',
      'orderby_order'    => 'DESC'        
    ));
    
  3. 使用它!

    while ( $query->have_posts() ) : $query->the_post();
        the_title();
        // more stuff here
    endwhile;
    
    wp_pagenavi( array( 'query' => $query ) );
    
    wp_reset_postdata();    // avoid errors further down the page
    

【讨论】:

  • 谢谢!!该代码有效。我只需要删除下面的filter_whereremove_filter。那些显示较旧的帖子。
  • 我实际上也不得不删除add_filter( 'posts_where', 'filter_where' );。它导致了一个错误,似乎没有
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 2011-03-20
  • 2014-05-21
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多