时间:2024-03-30
我在使用WordPress开发新闻主题或者CMS主题的时候,经常有设置文章位置的需求,比如为首页和分类单独设置置顶文章。一般我们通过自定义字段来实现,设置起来也很简单。
但是,如果我们需要取消置顶,比较麻烦。需要在前台找到对应文章,然后取消置顶勾选并保存。想要统计一下总共有多少篇置顶文章更是不易。不过,通过添加一个置顶文章筛选项,可以方便地实现这些需求。
在之前的文章中,我介绍了如何在WordPress后台文章列表中添加自定义筛选项。如果我们能够在后台增加一个置顶文章的筛选项,类似于默认的文章状态和置顶筛选,那么可以直接显示置顶文章的数量,并点击链接筛选出对应文章。
通过对WordPress文章列表代码的研究,我们发现可以利用Filter来实现这个需求。下面,就是具体实现的步骤。
为文章类型筛选项添加分类置顶和首页置顶筛选项。需要注意的是,这一步仅仅是添加了置顶文章筛选项,但点击筛选项链接还没有任何作用。
add_filter('views_edit-post', function($views) { $views[] = '<a href="'. add_query_arg('position', '_featured_in_category') .'"><i class="glyphicon glyphicon-pushpin"></i> 分类置顶</a>'; $views[] = '<a href="'. add_query_arg('position', '_featured_in_home') .'"><i class="glyphicon glyphicon-pushpin"></i> 首页置顶</a>'; return $views; });
根据用户点击的筛选链接中的查询字符串,添加查询参数到WordPress文章列表查询对象中,以达到筛选文章的目的。
add_filter('parse_query', function($query) { global $pagenow; if( is_admin() && 'edit.php' == $pagenow && isset($_GET['position']) && $_GET['position'] != '' ) { $position = $_GET['position']; $query->query_vars['meta_key'] = $position; $query->query_vars['meta_value'] = 'yes'; $query->query_vars['meta_compare'] = '='; } return $query; });
完成了前面两步之后,就可以在后台文章列表中筛选文章,并显示置顶文章的数量。下面的函数可以统计某个“meta_key”为“yes”的文章的总数,我们可以使用这个函数为第一步的置顶文章筛选链接添加置顶文章总数统计的功能,只需将函数添加到第一步的代码中对应位置即可。
/** * 查询某位置的文章数量 * * @param $position * * @return int */ function wprs_count_position_post($position) { global $wpdb; $query = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( wp_postmeta.meta_key = '$position' AND wp_postmeta.meta_value = 'yes' ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC"); return count($query); }
除此之外,我们还可以将设置置顶文章的功能添加到文章列表或快速编辑中,进一步提高了操作效率。但这不属于这篇文章的讨论范围,就不再详细讲解。如果需要,可以自行研究。
Copyright © 2019-2024 8888888888888888888888888888888888.com