如何获取页面URL的第二个片段?

时间:2011-10-21 作者:Jonathan

我有一些帖子custom field 调用year. 年份范围从1900 to 2011. 我想为每年创建一个单独的页面,该页面将显示该年的帖子。因此,我将创建一个带有模板和自定义查询的页面,以查找特定年份的所有帖子。

然而,我不想创建100多个独立年份的页面,我只想创建一个页面,该页面将从URL中提取参数并将其转换为一个变量,然后找到带有该变量的帖子。

因此,与其创建单独的页面base.com/year/1990 , base.com/year/1991, base.com/year/1992 我只想创建一个页面并提取年份。例如,我想提取2008 此页面外的URL:

http://www.base.com/year/2008
我已经知道我可以提取year 使用此代码:

$post->post_name;
但如何获取其他参数?

谢谢

3 个回复
SO网友:soulseekah

此问题可以通过WordPress Rewrite API

最简单的方法是,我假设您创建了一个名为year 请求很可能与此规则匹配(.+?)(/[0-9]+)?/?$, 将查询重写为pagename=year.

但是,您会从正则表达式中注意到/ 可以与后面的数字匹配。

正在请求/year/1999 将查询转换为pagename=year&page=%2F1999. 因此page 是将包含的内容1999. 你可以使用get_query_var(\'page\'); 并使用get_posts() 再多喂一点meta_keymeta_value 要检索您的帖子,请执行以下操作:

$args[\'meta_key\'] = \'year\';
$args[\'meta_value\'] = get_query_var(\'page\');
// ... other arguments
$posts_array = get_posts( $args );
但这不是错吗

如果使用这个意外的结果和在今年感觉不对的时候获取页面并将其输入的行为,您可以通过以下不同的方式来实现相同的结果adding your own rewrite rule.

通过添加将匹配的规则^year/([^/]\\d+)/?\' 并重写为pagename=year&custom_year=$matches[1] 您将能够访问custom_year 通过$wp 全局对象。

// this has to be done only once!
add_rewrite_rule(\'^year/([^/]\\d+)/?\',
    \'index.php?pagename=year&custom_year=$matches[1],
    \'top\');
flush_rewrite_rules();
应该将上面的代码打包,以便挂接到init 行动查询本身可以从$wp->matched_query 属性,并且必须进行分析:

global $wp; // may be required to bring into scope

$q_args = array();
parse_str($wp->matched_query, $q_args);
$custom_year = $q_args[\'custom_year\'];

$args[\'meta_key\'] = \'year\';
$args[\'meta_value\'] = get_query_var(\'custom_year\');
// ... other arguments
$posts_array = get_posts( $args );
请注意如何选择自定义查询字段的名称,并确保它不会与任何reserved terms.

从另一个角度来看,你最好从归档的角度而不是从页面的角度来看待整个情况。如果为帖子注册自己的自定义分类法,而不是自定义字段,则可以根据该分类法查询帖子,而无需手动添加其他重写规则。

这个register_taxonomy() 函数将允许您添加custom_year 分类法和it查询获取归档页,无需额外的解析、查询等。

你可能不得不flush_rewrite_rules() 在注册分类法之后,为了刷新一些新规则,WordPress在注册分类法时会自动生成一些新规则。

注意rewrite 您提供给的参数register_taxonomy(), 将其设置为custom_year 您应该能够在分类法中查询帖子,而无需进一步修改。

SO网友:EarnestoDev

global $post;
// This is how you get the year of a post, not from the URL
$post_year = idate(\'Y\', strtotime("{$post->post_created_gmt} GMT"));
要从数据库中获取它们,请执行以下操作:

global $wpdb;
$archive = array();
foreach(($rows = $wpdb->get_results(
    "SELECT `ID`, YEAR(`post_date_gmt`) AS `Year` FROM {$wpdb->posts}
        WHERE `post_type`=\'post\' ORDER BY `post_date_gmt` DESC;"
)) as $row){
    if(!isset($archive[$row->Year])){
        $archive[$row->Year] = array();
    }
    $archive[$row->Year][] = $row->ID;
}
foreach($archive as $year => $posts){
    foreach($posts as $post){
        $permalink = get_permalink($post);
        $post = get_post($post);
        // Do stuff with $year and $post here
    }
}
现在,您可以添加自己的代码,而不是// Do stuff with $year... 并根据你的意愿处理这些帖子。如果你有数以万计的帖子,你需要通过按年份分组来对此进行一些优化。

这是一个起点。

您好

SO网友:EarnestoDev

REMIX:

global $wpdb;
$archive = array();
foreach(($rows = $wpdb->get_results(
    "SELECT t1.`ID`, t2.`meta_value` AS `Year` FROM
        {$wpdb->posts} AS t1, {$wpdb->postmeta} AS t2
    WHERE t2.`meta_key`=\'year\' AND
        t1.`ID` = t2.`post_id` AND
        t1.`post_type`=\'post\'
    ORDER BY `Year` DESC, `post_date_gmt` DESC;"
)) as $row){
    if(!isset($archive[$row->Year])){
        $archive[$row->Year] = array();
    }
    $archive[$row->Year][] = $row->ID;
}
foreach($archive as $year => $posts){
    foreach($posts as $post){
        $permalink = get_permalink($post);
        $post = get_post($post);
        // Do stuff with $year and $post here
    }
}
希望这有助于奠定基础:)

您好

结束

相关推荐

使用特定的Twitter用户URL和hashtag修改unctions.php的代码

我希望导入带有特定标签的推文,并在下面的链接中看到了这条很棒的回复和编码。我的问题是如何从一个特定的推特用户那里获取帖子,下面链接中的代码是否会针对多个hashtag进行定制。如果有人可以建议在何处修改编码以添加到功能。带有特定用户url的php将不胜感激。我熟悉php和wordpress,但仍在学习所有细节。再次感谢!!干杯Importing Tweets with certain hashtags into Wordpress