2010-06-29 53 views
1

如果我有一个名为“my_type”自定义职位类型,我怎么能得到的WordPress,使基于日期的档案,例如:基于日期的档案定制post_types(WordPress的3.0)

mysite.com/my_type/2010/ 
mysite.com/my_type/2010/07/ 
mysite.com/my_type/2010/07/28/ 

我m寻找关于创建重写规则和链接到模板的提示。

谢谢!


更新: 我试过在我的functions.php以下(EVENT_TYPE_SLUG是别处定义的常量):

function event_rewrite_rules() { 
    global $wp_rewrite; 
    $new_rules = array(
     EVENT_TYPE_SLUG."/([0-9]{4})/([0-9]{1,2})/$" => 'index.php?post_type=event&year='.$wp_rewrite->preg_index(1).'&monthnum='.$wp_rewrite->preg_index(2), 
     EVENT_TYPE_SLUG."/([0-9]{4})/$" => 'index.php?post_type=event&year='.$wp_rewrite->preg_index(1), 
    ); 
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; 
} 
add_action('generate_rewrite_rules', 'event_rewrite_rules'); 

重写规则在$ wp_rewrite->规则露面,但当我导航到这些网页时,我收到了404错误。如果我手动导航到mysite.com/index.php?post_type=event&year=2010,我重定向到mysite.com/2010?post_type=event

回答

0

OK ......花了一些时间,但我想通了这一点(有可能是更优雅的解决方案在那里)。

1)创建一个标准的wordpress页面作为存档页面(并给我访问模板)。我将页面的slug定义为一个常量(EVENT_ARCHIVE_BASE),以便它在一个地方进行硬编码并在其他地方引用。

2)进行自定义重写赶上该页面的网址,将其重定向到页面规则:

function event_date_queryvars($qvars) { 
    array_push($qvars, 'eyear', 'emonth'); 
    return $qvars; 
} 
add_filter('query_vars', 'event_date_queryvars'); 

function event_date_rewrite_rules() { 
    // Adds rewrite rules for date-based event archives 
    global $wp_rewrite; 
    $new_rules = array(
     EVENT_ARCHIVE_BASE."/([0-9]{4})/([0-9]{1,2})/?$" => 
      "index.php?pagename=".EVENT_ARCHIVE_BASE."&eyear=".$wp_rewrite->preg_index(1)."&emonth=".$wp_rewrite->preg_index(2), 
     EVENT_ARCHIVE_BASE."/([0-9]{4})/?$" => "index.php?pagename=".EVENT_ARCHIVE_BASE."&eyear=".$wp_rewrite->preg_index(1), 
    ); 
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; 
} 
add_action('generate_rewrite_rules', 'event_date_rewrite_rules'); 

3)在我的页面模板的顶部,我检查了自定义查询VAR和构建页面因此。 (我应该已经能够使用内置的一年monthnum,但不能让他们正常工作未来的故障排除。):

// Was the page called with a specific year, month, or just plain? 
$year = get_query_var('eyear'); 
$monthnum = sprintf('%02d', get_query_var('emonth')); 
if ($monthnum) { 
    $list_type = 'Month'; 
    $monthname = $month[$monthnum]; 
    $heading = "Events from $monthname, $year"; 
} elseif ($year) { 
    $list_type = 'Year'; 
    $heading = "Events from $year"; 
} else { 
    $list_type = 'AllPast'; 
    $heading = get_the_title(); 
} 

感谢您的帮助,并希望这是对别人有用!让我知道如果你有一个更简单/内置的方式来做到这一点。

0

BENJ我认为WordPress的自动创建自定义后类型档案

+1

如果是这样,我找不到它们...... 以下确实存在:'mysite.com/2010/?post_type = event',但它指向标准存档页面,并且仅基于事件进行过滤。它不给我我正在寻找的网址结构。 – Benj 2010-06-29 14:30:15

0

我设法找到更优雅/内置的解决方案。

诀窍在“post_type = article”参数中。 如果你创建了这样一个改写:

'(articles)/([0-9]{4})' => 'index.php?post_type=article&eyear=' . $wp_rewrite->preg_index(2) 

这将使你的URL结构,但经过默认的“归档”模板。 然后,您将模板从默认位置移到您自己的存档模板。 (例如“存档articles.php”)

此功能能实现这一点(对我的作品):

add_action("template_redirect", 'my_template_redirect'); 

// Template selection 
function my_template_redirect() 
{ 
    global $wp; 
    global $wp_query; 
    if ($wp->query_vars["post_type"] == "article") 
    { 
     if (have_posts()) 
     { 
      include(TEMPLATEPATH . '/archive-articles.php'); 
      die(); 
     } 
     else 
     { 
      $wp_query->is_404 = true; 
     } 
    } 
} 

您仍然需要创建自己的方法来处理get_query_var()的为年/月/日,但至少您不需要创建自定义页面模板。