有人能给我讲讲,解释一下如何创建一些通过pretty link传递的“过滤器”吗?
让我自我解释一下,我有一个自定义的帖子类型,叫做"spectacle" 我有一个meta\\u键,其中包含了这场奇观的一系列日期。我知道如何提取我的日期,并对其进行过滤如果我明确地对我的显示进行一些过滤,我的问题不是从那里来的,我试图实现的是访问
http://myurl.com/spectacles (展示即将到来的眼镜-already done) http://myurl.com/spectacles/2014 (展示所有2014年奇观)http://myurl.com/spectacles/2014/01 (从2014年1月开始展示所有奇观)http://myurl.com/spectacles/2014/01/01 (从2014年1月1日起展示所有奇观)http://myurl.com/spectacle/name-of-the-spectacle (展示这一奇观—already done)
我只需要一种方法来启用这些永久链接并提取这些参数,这样我就可以做我想做的事情了,我已经有了过滤功能。
这就是我目前所做的:
// Register Custom Post Type
function build_cpt() {
$labels = array(
\'name\' => _x( \'Programmation\', \'Post Type General Name\', \'mlog_lang\' ),
\'singular_name\' => _x( \'Spectacles\', \'Post Type Singular Name\', \'mlog_lang\' ),
\'menu_name\' => __( \'Programmation\', \'mlog_lang\' ),
\'all_items\' => __( \'Tous les spectacles\', \'mlog_lang\' ),
\'view_item\' => __( \'Afficher ce spectacle\', \'mlog_lang\' ),
\'add_new_item\' => __( \'Ajouter un spectacle\', \'mlog_lang\' ),
\'add_new\' => __( \'Ajouter un spectacle\', \'mlog_lang\' ),
\'edit_item\' => __( \'Modifier un spectacle\', \'mlog_lang\' ),
\'update_item\' => __( \'Mettre à jour ce spectacle\', \'mlog_lang\' ),
\'search_items\' => __( \'Rechercher un spectacle\', \'mlog_lang\' ),
\'not_found\' => __( \'Aucun spectacle trouvé\', \'mlog_lang\' ),
\'not_found_in_trash\' => __( \'Aucun spectacle dans la corbeille\', \'mlog_lang\' ),
);
add_rewrite_tag( \'%event-year%\', \'(\\d{4})\' );
//add_rewrite_tag( \'%event-month%\', \'(\\d{2})\' );
//add_rewrite_tag( \'%event-day%\', \'(\\d{2}|\\d{1})\' );
$rewrite = array(
//\'slug\' => \'spectacles/%event-year%/%event-month%/%event-day%/\',
\'slug\' => \'spectacles/%event-year%/\',
\'with_front\' => true,
\'pages\' => true,
\'feeds\' => true,
);
$args = array(
\'label\' => __( \'programmation\', \'mlog_lang\' ),
\'description\' => __( \'Liste des spectacles\', \'mlog_lang\' ),
\'labels\' => $labels,
\'supports\' => array( \'title\', \'editor\', \'revisions\' ),
\'taxonomies\' => array(),
\'hierarchical\' => false,
\'public\' => true,
\'show_ui\' => true,
\'show_in_menu\' => true,
\'show_in_nav_menus\' => false,
\'show_in_admin_bar\' => false,
\'menu_position\' => 4,
\'menu_icon\' => \'dashicons-groups\',
\'can_export\' => true,
\'has_archive\' => true,
\'exclude_from_search\' => false,
\'publicly_queryable\' => true,
\'rewrite\' => $rewrite,
\'capability_type\' => \'page\',
);
register_post_type( \'programmation\', $args );
现在我可以访问:
http://myurl.com/spectacles/2014
但它显示的是主页,而不是归档程序。php
我无法访问:
http://myurl.com/spectacles/name-of-the-spectacle
最合适的回答,由SO网友:Jonathan Lafleur 整理而成
好的答案来自@Milo,但他没有发布任何代码,所以我在这里发布了我的结果,供来这里寻找正确答案的人使用。
/* Add query var to authorized query var... */
add_filter( \'query_vars\', \'add_spectacles_query_vars\' );
function add_spectacles_query_vars( $query_vars ) {
$query_vars[] = \'spectacles-year\';
$query_vars[] = \'spectacles-month\';
$query_vars[] = \'spectacles-day\';
return $query_vars;
}
/* Add rewrite rule */
add_action( \'init\', \'add_spectacles_rewrite_rule\' );
function add_spectacles_rewrite_rule()
{
add_rewrite_rule(
\'spectacles\\/(on){1}\\/{1}(\\d{4})+\\/?(\\d{2})?\\/?(\\d{2}|d{1})?\',
\'index.php?post_type=programmation&spectacles-year=$matches[2]&spectacles-month=$matches[3]&spectacles-day=$matches[4]\',
\'top\'
);
//flush_rewrite_rules();
}
在我的模板中我可以使用
$spectacle_year = get_query_var(\'spectacles-year\');
$spectacle_month = get_query_var(\'spectacles-month\');
$spectacle_day = get_query_var(\'spectacles-day\');
另外,我正在档案页面中直接过滤我的眼镜,但可以通过以下方式完成:
add_action( \'pre_get_posts\', \'spectacles_archvies_pre_get_posts\', 11 );
function spectacles_archvies_pre_get_posts($query) {
if( !empty($query->query_vars[\'spectacles-year\']) ) {
/* Do your stuff here... */
}
}