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 您需要的格式. 我希望这有帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |