默认 WordPress 提供的 RSS 链接只能获得最近的十篇日志,如果想得到更多,或是用于某种目的而想通过 RSS 获得所有的日志,那恐怕就得做些手脚了,或许还有更简单的办法,只是我这里改了下源代码中的 limit 查询参数。
关于 WordPress 的 Feed 请参考:http://codex.wordpress.org/WordPress_Feeds,用以下代码可以输出你实际的 RSS 的 URL:
URL for RDF/RSS 1.0 feed <?php bloginfo('rdf_url'); ?>
URL for RSS 0.92 feed <?php bloginfo('rss_url'); ?>
URL for RSS 2.0 feed <?php bloginfo('rss2_url'); ?>
URL for Atom feed <?php bloginfo('atom_url'); ?>
URL for comments RSS 2.0 feed <?php bloginfo('comments_rss2_url'); ?>
在我的机器上永久链接后是用 http://unmi/feed/ 来访问 rss2,模板将会用 wp-includes/feed-rss2.php 文件。要说定位到这段代码还真不简单。
index.php 中 require('./wp-blog-header.php');
wp-blog-header.php 里
1 2 3 |
wp(); require_once( ABSPATH . WPINC . '/template-loader.php' ); |
再到 wp-includes/templte-loader.php 中
1 2 3 4 |
elseif ( is_feed() ) : do_feed(); return; |
在执行 do_feed() 之前,$wp_query 中早已有了我们想要的数据,所以还应回溯到 wp-blog-header.php 中的 wp() 函数去。wp() 去调用 wp-includes/functions.php 中的
1 2 3 4 5 6 7 |
function wp( $query_vars = '' ) { global $wp, $wp_query, $wp_the_query; $wp->main( $query_vars ); if ( !isset($wp_the_query) ) $wp_the_query = $wp_query; } |
再由 $wp->main($query_vars) 进到 wp-includes/classes.php 中的 main($query_qrgs = '') 函数,其中的
$this->query_posts();
去查询记录,看该 wp-includes/classes.php 的 query_posts() 函数:
1 2 3 4 5 |
function query_posts() { global $wp_the_query; $this->build_query_string(); $wp_the_query->query($this->query_vars); } |
再进到 wp-includes/query.php 中的 query($query) 函数
1 2 3 4 5 |
function &query($query) { $this->parse_query($query); return $this->get_posts(); } |
就是这个关键的 wp-includes/query.php 的 &get_posts() 函数,在里面可以看到怎样获得 $limits 参数的,在大约第 2412 行处可以看到:
1 2 3 4 5 6 |
$this->request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits"; if ( !$q['suppress_filters'] ) $this->request = apply_filters_ref_array('posts_request', array( $this->request, &$this ) ); $this->posts = $wpdb->get_results($this->request); |
对,在执行它之前,把 $limits 改了就是,比如
$limits = "limit 0,50";
或者要查询出全部日志的话就让 $limits 为空。实际上,你可能更应该去发掘 $limits 是怎么获得的,比如 step into 到这行代码:
$limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) );
说不定能找到更简单的办法来解决现在的问题。
而追踪代码的同时也发现,全局变量 $wp_query 中有些配置,如:$wp_the_query->query_vars["posts_per_page"],它的默认值是 10,$wp_the_query->query_vars["comments_per_page"] 为 50,还应注意 nopaging 和 paged 这两个参数,它们都为false。不过那些好像不会影响到 RSS 数据的显示,仍然是查询到多数记录输出多少。
对于 WordPress 的 php 代码真不好怎么单步调试,因为 UrlRewrite 之后,浏览器地址栏里的 URL 与文件系统中的 PHP 代码无法匹配到的,所以一路上只能用类似 echo 的办法,具体用的是下面的代码块:
1 2 3 4 5 |
ob_start(); var_dump($wp_query); $out = ob_get_contents(); ob_end_clean(); error_log($out, 3, "d:\\error_log.txt"); |
用 log4php 也应该可行的,要放哪声明出一个全局的 $logger,然后四处 global $logger, $logger->debug() 了,但信息还不如 var_dump() 好看。
本文链接 https://yanbin.blog/wordpress-show-all-rss-data/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。