有没有一个PHP函数可以匹配给定URL之后的任何内容,这样我的if语句就可以在每个实例中工作?

时间:2011-07-17 作者:Andrew

下面显示了一个IF语句,它基于url运行两个自定义查询中的一个。我面临的问题是url是否包含分页,例如/page/2/, 我的查询中断,因为url未正确匹配。我对php非常陌生,在我的搜索中,我遇到了一些不同的php函数,这些函数可能对我的情况有所帮助——我只是不确定如何使用它们,以及哪种函数更适合我的需要。这些是preg_match, parse_url, 和dirname.

例如site.com/players 列出玩家和site.com/players/type/pro 列出职业球员。后者已被重写,实际上site.com/players/?type=pro.

下面的if语句是我现在使用的语句,如果url在/pros/segment之后有任何内容,例如我的分页,则不会运行第一个查询:

if ( $_SERVER[\'REQUEST_URI\'] == \'/players/type/pros/\' ) {
     //run the query to list the pros
}

else {
    //run the default query for the players
}
下面是我需要做的,它可以工作,但不需要为每一页编写OR的所有体力劳动。这就是我猜测其中一个php函数将发挥作用的地方。

if ( $_SERVER[\'REQUEST_URI\'] == \'/players/type/pros/\' || $_SERVER[\'REQUEST_URI\'] == \'/players/type/pros/page/2/\' || $_SERVER[\'REQUEST_URI\'] == \'/players/type/pros/page/3/\' || $_SERVER[\'REQUEST_URI\'] == \'/players/type/pros/page/4/\' ) {
     //run the query to list the pros
}

else {
    //run the default query for the players
}

Update

感谢那些回答的人。我一直在钻研WordPress的重写,在这个网站上一些信息丰富的帖子的帮助下,我最终还是这样做了。

制作了一个名为“玩家类型”的新页面模板。处理传入查询的php。我可能需要进一步列出其他类型的球员。

在函数中设置一些重写规则。php

add_filter(\'init\', \'add_page_rewrite_rules\');
function add_page_rewrite_rules() {
    //would match www.site.com/players/type/pro    
    add_rewrite_rule(\'^players/type/([^/]*)/?$\',\'index.php?pagename=player-types&type=$matches[1]\',\'top\');  
    //would match www.site.com/players/type/pro/page/2    
    add_rewrite_rule(\'^players/type/([^/]*)/page/([0-9]+)?$\',\'index.php?pagename=player-types&type=$matches[1]&paged=$matches[2]\',\'top\');       
}
添加了type 变量至query_vars 所以我可以在新的页面模板上使用它(放在functions.php中)

add_filter( \'query_vars\', \'add_query_vars\' );
function add_query_vars( $query_vars ) {
    $query_vars[] = \'type\'; //add type to query vars
    return $query_vars;
}
最基本形式的页面模板如下所示

<?php /* Template Name: Player Types */ ?>

<?php if ( $wp_query->query_vars[\'type\'] == \'pro\' ) {
    //custom pro query
} ?>
这让我www.site.com/players/type/pro 我可以把它扩展到www.site.com/players/type/whatever-else. 普通玩家仍列在www.site.com/players/.

对于那些想知道的人,我没有使用分类法,因为我是根据他们的自定义WordPress角色(将作者id拉入查询)列出玩家,而不是有一个必须手动检查的复选框。

2 个回复
最合适的回答,由SO网友:Milo 整理而成

查找字符串page/ 并使用strpossubstr:

$url = \'/players/type/pros/page/3/\';
$find = \'page/\';
$trimmed_url = substr( $url, 0, strpos($url, $find) );
编辑-因此在问题的上下文中,您可以使用:

$url = $_SERVER[\'REQUEST_URI\'];
$find   = \'page/\';
$pos = strpos($url, $find);
if($pos):
    $url = substr($url, 0, $pos);
endif;

if( $url == \'/players/type/pros/\' ){
    //run the query to list the pros
}
但我有一个问题-为什么要使用URL来确定要加载的内容,您不能检查$\\u GET[\'type\']或正在设置的任何查询变量吗?

SO网友:Samuel Hulick

你可以explode 将字符串输出为各个片段(由“/”字符分隔),然后分析片段。

<?php $url_pieces = explode(\'/\', $_SERVER[\'REQUEST_URI\']); ?>
在您的第一个示例中,$url_pieces[0] 将是“玩家”,$url_pieces[1] 将是“类型”,等等。

如果您想确保“玩家”排在第一位,“职业选手”排在第三位,您可以执行以下操作:

<?php if (($url_pieces[0] == \'players\') && ($url_pieces[2] == \'pros\')) { // do stuff ?>
如果你所关心的只是“专业人士”在某个地方,那么你可以更简单地评估:

<?php if (in_array(\'pros\', $url_pieces)) { // do stuff ?>

结束

相关推荐

Pagination with custom loop

我的问题可能是Pagination not working with custom loop, 但有一种不同。我使用自定义循环来显示flash游戏。我想按类别在游戏页面上分页。类别php:<?php if ($cat) { $cols = 2; $rows = 4; $paged = ((\'paged\')) ? get_query_var(\'paged\') : 1; $post_per_page = $cols * $rows; // -1 s