吵吵   2011-10-09  阅读:5,010

wordpress的整体架构我们曾经探讨过,首当其冲的是利用.htaccess来实现页面的跳转,将不同的网址页面全部都跳转到index的页面,以共享使用wp的核心库和api。这两天在看看wp的搜索功能,研究代码的同时发现wp在页面之间的传值,包括post和get都是统一处理的。这种整体架构的思想再次得以呈现,颇有可圈可点之处。
       
首先看的是wp核心类中的一个数组变量:
var $public_query_vars = array(‘m’, ‘p’, ‘posts’, ‘w’, ‘cat’, ‘withcomments’, ‘withoutcomments’, ‘s’, ‘search’, ‘exact’, ‘sentence’, ‘debug’, ‘calendar’, ‘page’, ‘paged’, ‘more’, ‘tb’, ‘pb’, ‘author’, ‘order’, ‘orderby’, ‘year’, ‘monthnum’, ‘day’, ‘hour’, ‘minute’, ‘second’, ‘name’, ‘category_name’, ‘tag’, ‘feed’, ‘author_name’, ‘static’, ‘pagename’, ‘page_id’, ‘error’, ‘comments_popup’, ‘attachment’, ‘attachment_id’, ‘subpost’, ‘subpost_id’, ‘preview’, ‘robots’, ‘taxonomy’, ‘term’, ‘cpage’, ‘post_type’);

这个数组就是wp中用来初始化数据库查询时候限制的变量的,如cat代表是哪个类别,而’s’和’search’即是由搜索界面post过来的变量,用来搜索整个站内资源的。

可以说wp用这样一个数组变量已经包含了所有需要的条件了,要显示出来的文章有什么要求,如类别,如页面,如日期时间,都会在这里格式话后然后再在数据库中查找,具体是如何格式化或者说获取这些变量的呢,就要看class-wp.php这个文件中的一个函数了:

/**
* Parse request to find correct WordPress query.
*
* Sets up the query variables based on the request. There are also many
* filters and actions that can be used to further manipulate the result.
*
* @since 2.0.0
*
* @param array|string $extra_query_vars Set the extra query variables.
*/
function parse_request($extra_query_vars = '') ($extra_query_vars = '')

看英文的说明就是先格式化query的条件,然后找到正确的结果。理所当然,这个就是格式话我们的post和get过来的变量了,事实上它除了格式化这些页面传递过来的值外还会先格式化url确定将要post的是那个类型以及获取客户端的ip等一些信息。我们不管这些,就看看它对$_POST数组的处理吧:

foreach ( $GLOBALS['wp_post_types'] as $post_type => $t )
if ( $t->query_var )
$post_type_query_vars[$t->query_var] = $post_type;

foreach ( $this->public_query_vars as $wpvar ) {
if ( isset( $this->extra_query_vars[$wpvar] ) )
$this->query_vars[$wpvar] = $this->extra_query_vars[$wpvar];
elseif ( isset( $_POST[$wpvar] ) )
$this->query_vars[$wpvar] = $_POST[$wpvar];
elseif ( isset( $_GET[$wpvar] ) )
$this->query_vars[$wpvar] = $_GET[$wpvar];
elseif ( isset( $perma_query_vars[$wpvar] ) )
$this->query_vars[$wpvar] = $perma_query_vars[$wpvar];

if ( !empty( $this->query_vars[$wpvar] ) ) {
if ( ! is_array( $this->query_vars[$wpvar] ) ) {
$this->query_vars[$wpvar] = (string) $this->query_vars[$wpvar];
} else {
foreach ( $this->query_vars[$wpvar] as $vkey => $v ) {
if ( !is_object( $v ) ) {
$this->query_vars[$wpvar][$vkey] = (string) $v;
}
}
}

if ( isset($post_type_query_vars[$wpvar] ) ) {
$this->query_vars['post_type'] = $post_type_query_vars[$wpvar];
$this->query_vars['name'] = $this->query_vars[$wpvar];
}
}
}

精华之处在于elseif ( isset( $_POST[$wpvar] ) )$this->query_vars[$wpvar] = $_POST[$wpvar];也就是说如果$_POST数组内有我们需要的变量,那么就加入到query_vars中去吧,经过这样一个循环就取得了所有的post的参数了。

后记:这种整体思想的好处是不言而喻的,但是同时也提醒我们写代码人的一个问题,那就是从一开始就要确定好数据库字段的名称,还有变量的名称,因为在一个整体架构中,必须要保证每个元素命名的唯一性;另外一个说来就是要徐汇这种整体架构思想,因为它能留出更多的扩展接口而且方便维护。唯一不太确定的就是如果面对的是一个cms的大型系统我们该怎么维护?

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

9条回应:“wordpress整体架构之post和get之间页面传值”

  1. 赵华阳说道:

    想和站长交流经验,所以也交换以下链接!留言通知即可!谢谢!

  2. 之前对这些都不是很了解的,接触之后懂得了一点点

  3. 豆芽机说道:

    看了博主的文章觉得非常值得学习,支持一下!

  4. 长春家教说道:

    读了博主顶了文章写的非常好!

  5. 博主的文章非常不错 支持一下!

  6. 博主写的非常好 支持一下

  7. 谢谢博主分享,支持下

  8. 道依茨说道:

    很好的东西,值得学习。

  9. 文章挺好,继续加油,期待你继续写出这么好的文章!http://hdch.236w.com

发表评论

电子邮件地址不会被公开。 必填项已用*标注