sql – 自定义帖子类型年度/月度存档

我的WordPress网站上有自定义帖子类型“新闻”.我正在使用高级自定义字段插件将元数据添加到每个帖子.

我想创建一个新闻项目数组作为存档:

[2013]
    [January] => 5
[2012]
    [January] => 20
    [February] => 10
[2011]
    [April] => 30

我设法让这个工作使用:

global $wpdb;
    $news = $wpdb->get_results(
        "SELECT wp_posts.post_date,COUNT(wp_posts.ID) as count
         FROM $wpdb->posts
         WHERE
         wp_posts.post_type = 'news' AND
         wp_posts.post_status = 'publish' AND
         wp_posts.post_date <= CURDATE() AND
         wp_posts.post_date >= DATE_SUB(CURDATE(),INTERVAL 3 YEAR)
         GROUP BY YEAR(wp_posts.post_date),MONTH(wp_posts.post_date)
         ORDER BY wp_posts.post_date DESC",ARRAY_A);

    $archive = array();
    foreach ($news as $post):
        $year = date('Y',strtotime($post['post_date']));      
        $month = date('m',strtotime($post['post_date']));     
        $month_name = date('F',strtotime($post['post_date']));
        $post['url'] = 'NOT SURE ABOUT URL';
        $archive[$year][$month_name] = $post;
    endforeach;

我需要能够使用http://example.com/2012/和http://example.com/2012/10/链接到特定年份和月份.

由于这涉及自定义帖子类型“新闻”,我不确定如何实现这一点?

解决方法

为了满足您的需求,您需要修改wordpress重写,以便能够捕获自定义帖子类型的年/月/等发布数据.

您可以使用以下代码执行此操作:

/**
 * Custom post type date archives
 */

/**
 * Custom post type specific rewrite rules
 * @return wp_rewrite             Rewrite rules handled by wordpress
 */
function cpt_rewrite_rules($wp_rewrite) {
    $rules = cpt_generate_date_archives('news',$wp_rewrite);
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
    return $wp_rewrite;
}
add_action('generate_rewrite_rules','cpt_rewrite_rules');

/**
 * Generate date archive rewrite rules for a given custom post type
 * @param  string $cpt        slug of the custom post type
 * @return rules              returns a set of rewrite rules for wordpress to handle
 */
function cpt_generate_date_archives($cpt,$wp_rewrite) {
    $rules = array();

    $post_type = get_post_type_object($cpt);
    $slug_archive = $post_type->has_archive;
    if ($slug_archive === false) return $rules;
    if ($slug_archive === true) {
        $slug_archive = $post_type->name;
    }

    $dates = array(
        array(
            'rule' => "([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})",'vars' => array('year','monthnum','day')),array(
            'rule' => "([0-9]{4})/([0-9]{1,'monthnum')),array(
            'rule' => "([0-9]{4})",'vars' => array('year'))
        );

    foreach ($dates as $data) {
        $query = 'index.PHP?post_type='.$cpt;
        $rule = $slug_archive.'/'.$data['rule'];

        $i = 1;
        foreach ($data['vars'] as $var) {
            $query.= '&'.$var.'='.$wp_rewrite->preg_index($i);
            $i++;
        }

        $rules[$rule."/?$"] = $query;
        $rules[$rule."/Feed/(Feed|rdf|RSS|RSS2|atom)/?$"] = $query."&Feed=".$wp_rewrite->preg_index($i);
        $rules[$rule."/(Feed|rdf|RSS|RSS2|atom)/?$"] = $query."&Feed=".$wp_rewrite->preg_index($i);
        $rules[$rule."/page/([0-9]{1,})/?$"] = $query."&paged=".$wp_rewrite->preg_index($i);
    }
    return $rules;
}

你会注意到我在$rules = cpt_generate_date_archives(‘news’,$wp_rewrite)中有硬编码的新闻.部分代码.您可以根据需要进行更改.

使用此代码,您应该能够导航到http://yoursite.com/news/2013/02/并接收特定时间内该特定帖子类型的存档列表.

为了完整起见,我将介绍如何生成每月归档窗口小部件以便利用它.

/**
 * Get a montlhy archive list for a custom post type
 * @param  string  $cpt  Slug of the custom post type
 * @param  boolean $echo Whether to echo the output
 * @return array         Return the output as an array to be parsed on the template level
 */
function get_cpt_archives( $cpt,$echo = false )
{
    global $wpdb; 
    $sql = $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_type = %s AND post_status = 'publish' GROUP BY YEAR($wpdb->posts.post_date),MONTH($wpdb->posts.post_date) ORDER BY $wpdb->posts.post_date DESC",$cpt);
    $results = $wpdb->get_results($sql);

    if ( $results )
    {
        $archive = array();
        foreach ($results as $r)
        {
            $year = date('Y',strtotime( $r->post_date ) );
            $month = date('F',strtotime( $r->post_date ) );
            $month_num = date('m',strtotime( $r->post_date ) );
            $link = get_bloginfo('siteurl') . '/' . $cpt . '/' . $year . '/' . $month_num;
            $this_archive = array( 'month' => $month,'year' => $year,'link' => $link );
            array_push( $archive,$this_archive );
        }

        if( !$echo )
            return $archive;
        foreach( $archive as $a )
        {
            echo '<li><a href="' . $a['link'] . '">' . $a['month'] . ' ' . $a['year'] . '</a></li>';
        }
    }
    return false;
}

要使用此功能,只需提供自定义帖子类型的slug,即:get_cpt_archives(‘news’).这将返回一组唯一的年/日/链接,即:

Array
(
    [0] => Array
        (
            [month] => February
            [year] => 2013
            [link] => http://yoursite.com/news/2013/02
        )

    [1] => Array
        (
            [month] => January
            [year] => 2013
            [link] => http://yoursite.com/news/2013/01
        )

)

您可以使用foreach遍历这些并根据需要输出它们.

或者,您可以使用get_cpt_archives(‘news’,true),它将自动回显包含在< li>中的每个项目.链接到其特定存档.

输出的格式不是你想要的,所以你必须稍微调整一下才能让它显示

Year
    Month
    Month
Year
    Month

您需要的格式.

我希望这有帮助.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...