我在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,2})",
'vars' => array('year', '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;
}
您会注意到,我已经硬编码news
了$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;
}
要使用此功能,只需提供自定义帖子类型的标签,即:get_cpt_archives( 'news' )
。这将返回一个唯一的Year / Date /
Links数组,即:
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
)
)
您可以使用a遍历这些内容,foreach
并根据需要输出它们。
或者,您可以使用get_cpt_archives( 'news', true )
,它将自动回显包装在<li>
指向其特定档案的链接中的每个项目。
输出的格式不完全是您想要的格式,因此您必须对其进行一些调整才能使其显示在
Year
Month
Month
Year
Month
您需要的格式。
我希望这有帮助。
我有一个自定义的帖子类型设置,有许多类别和子类别。 我试图做的是创建一个页面,显示特定类别中的所有帖子,并使用一个菜单列出所有类别子类别,以便可以过滤帖子。 我已尝试复制存档模板并将其重命名为分类法-(我的自定义分类法)。php,如果我转到slug,它会显示某些帖子,并使用
我有一个自定义的帖子类型和一个像这样创建的公文包分类法: 当我在查询中使用它时,它的工作原理应该是这样的。它显示在后端的菜单中,以及此自定义帖子类型的类别。 我的问题是,当我尝试从某个类别检索所有帖子时(通过单击类别名称),我发现
本文向大家介绍WordPress 3.0中的自定义帖子类型,包括了WordPress 3.0中的自定义帖子类型的使用技巧和注意事项,需要的朋友参考一下 本文与WordPress 3.0相关。此处发布的许多代码在以前的版本中将不起作用,并且某些信息可能会在较新的版本中更改。 WordPress已经在系统中内置了五种不同的内容类型。 帖子 这是标准的内容类型,通常是博客安装中使用最多的内容。帖子往往会
本文向大家介绍WordPress 注册自定义帖子类型,包括了WordPress 注册自定义帖子类型的使用技巧和注意事项,需要的朋友参考一下 示例 假设您有一个图书馆网站,并且想要一个名为Books的自定义帖子类型。可以注册为 如此简单,您现在就注册了一个自定义帖子类型。 该代码段可以放在主题functions.php文件中,也可以放在插件结构中。
我已经创建了一个WordPress自定义帖子类型,然后我创建了REST API自定义endpoint来让所有帖子正常工作。然后,我创建了另一个自定义endpoint,通过ID获取单个帖子。例如http://localhost:8888/WordPress/WP-JSON/LC/v1/cars/120 我已经创建了一些帖子,每次我将路线末端的ID更改为118或116时,它都会显示最新的post-ID
我创建了一个WordPress自定义帖子类型,然后我创建了REST API自定义endpoint以获取所有帖子运行良好。然后我创建了另一个自定义endpoint以按ID获取单个帖子。例如http://localhost:8888/wordpress/wp-json/lc/v1/cars/120 我已经创建了一些帖子,每次我将路线末端的ID更改为118或116时,它都会显示最新的post-ID 12