站点图标 WordPress智库

WordPress 后台文章列表添加自定义字段筛选项

在使用 WordPress开发新闻主题或者 CMS 主题的时候,我们经常会有设置文章位置的需求,一般我们通过自定义字段来实现,如下图,我们实现的需求是为首页和分类单独设置置顶文章,操作起来很简单,如果需要设置文章置顶,勾选相应的置顶位置就可以了。

设置了置顶文章之后,如果我们需要取消置顶,比较快捷的方法是在前台找到这篇文章,然后点击编辑链接,然后取消置顶勾选,然后再保存这篇文章,这么多然后,操作起来真是麻烦。要是我们想统计一下总共有多少篇置顶文章,该是一个怎么样的操作?大家可以想象一下。

在本站之前的文章「WordPress 后台文章列表中添加自定义字段过滤筛选条件」中,我为大家介绍了怎么通过添加一个下拉筛选项来过滤文章。如果可以像下图一下,在后台增加一个置顶文章的筛选项,类似于默认的文章状态和置顶筛选,可以直接显示置顶文章的数量,点击链接可以直接把置顶文章筛选出来,是不是方便了许多?

我们研究了一下 WordPress 文章列表的代码,发现是有 Filter 可以帮助我们实现这个需求的。下面是实现这个需求的代码。

第一步、添加分类置顶和首页置顶筛选链接

添加分类置顶和首页置顶筛选项到文章类型筛选项后面。这一步只是添加了置顶文章筛选项,点击筛选项链接还没有任何作用,我们需要修改后台文章查询才可以把置顶文章筛选出来。

add_filter('views_edit-post', function ($views)
{

    $views[] = '<a href="' . add_query_arg('position', '_featured_in_category') . '">分类置顶</a>';
    $views[] = '<a href="' . add_query_arg('position', '_featured_in_home') . '">首页置顶</a>';

    return $views;
});

第二步、添加置顶文章查询参数到查询对象中,以过滤文章

根据用户点击的筛选链接中的查询字符串,添加查询参数到后台文章列表查询对象中,以达到筛选文章的目的。

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

除了上面的操作,我们还可以把设置置顶文章的功能添加到文章列表或快速编辑中,让设置置顶文章的操作更加方便快捷。不过这不属于这篇文章的讨论范围,就暂且按下不表了。有需要的朋友可以自己研究一下。

退出移动版