正如在RRikesh的回答中提到的那样,多侧安装使一切变得更容易,因为它是同一个数据库,您可以访问它。
如果您在连接到外部数据库时遇到问题(可能有一些安全限制,或者数据库不在同一台服务器上),您必须做更多的工作。在这种情况下,您可以获取提要、解析并存储它。
获取提要有点问题,因为提要通常返回最新的x个帖子(默认为10个帖子)。如果你想用all 发布后,您必须安装一个“服务器”插件来修改设置。为了不干扰正常的提要行为,我使用url参数触发无限提要。让我们从“服务器”插件开始。
/**
* Plugin Name: Fetch Posts Server
* Plugin URI:
* Description: Allow to fetch all posts in XML format from another blog
* Version: 0.1
* Author: Ralf Albert
* Author URI: http://yoda.neun12.de
* License: GPLv3
*/
namespace FetchPostsServer;
add_filter(
\'query_vars\',
function( $qvars ) {
array_push( $qvars, \'getall\' );
return $qvars;
}
);
add_action( \'pre_get_posts\', __NAMESPACE__ . \'\\get_all_posts_as_xml\' );
function get_all_posts_as_xml( $query ) {
if ( true === $query->is_feed ) {
$getall = ( isset( $query->query[\'getall\'] ) ) ? $query->query[\'getall\'] : \'\';
if ( ! empty( $getall ) ) {
// remove the feed posts limit
add_filter(
\'post_limits_request\',
function( $limits ) { return \'\'; }
);
}
}
}
这很简单。首先插件添加一个查询变量。在下一步中,插件钩住
pre_get_posts
, 检查是否请求了提要,并检查查询变量
getall
已设置。如果已设置,请添加过滤器以删除post限制。
如果我们现在请求一个提要并传递url参数getall
, 我们得到all 而不是通常限制在10个左右的职位。
在“客户端”方面,这是一项更大的工作。我们需要一个cron来检查新帖子,在第一次运行时获取所有帖子,并在需要时返回存储的帖子。我选择选项表来存储帖子,我认为这是最好的地方。
/**
* Plugin Name: Fetch Posts Client
* Plugin URI:
* Description: Fetch posts in XML format from another blog
* Version: 0.1
* Author: Ralf Albert
* Author URI: http://yoda.neun12.de
* License: GPLv3
*/
namespace FetchPostsClient;
// schedule event
if ( ! wp_next_scheduled( \'fetch_posts\' ) ) {
wp_schedule_event( time(), \'daily\', \'fetch_posts\' );
}
add_action( \'fetch_posts\', __NAMESPACE__ . \'\\fetch_posts\' );
/*
* fetch the newest posts once a day
*/
function fetch_posts() {
fetch_posts_as_xml( array( \'url\' => \'http://wpse.tld/\', \'cat\' => \'uncategorized\', \'return\' => false ) );
}
/*
* fetching the posts
*/
function fetch_posts_as_xml( $args, $return = false ) {
// for debugging
//add_filter( \'wp_feed_cache_transient_lifetime\' , function() { return 5; } );
// get stored posts from options
$fetched_posts = get_option( \'fetched_posts\' );
// if we just need the stored posts, return them
if ( true == $return || ( isset( $args[\'return\'] ) && true == $args[\'return\'] ) )
return $fetched_posts;
// prepare fetching the feed
if ( ! function_exists( \'fetch_feed\' ) )
include_once( ABSPATH . WPINC . \'/feed.php\' );
if ( ! isset( $args[\'url\'] ) )
return;
$url = $args[\'url\'];
/*
* other options like author, tag, etc. possible
*/
// add category (if present)
if ( isset( $args[\'cat\'] ) )
$url = add_query_arg( array( \'cat\' => $args[\'cat\'] ), $url );
// need the feed (rss2)
$url = add_query_arg( array( \'feed\' => \'rss2\' ), $url );
// for debugging
//printf( \'<p>Posts stored: %d<br>\', sizeof( $fetched_posts ) );
// if no posts are stored, this is the first run, get all posts
if( empty( $fetched_posts ) )
$url = add_query_arg( array( \'getall\' => 1 ), $url );
// start fetching the feed
$rss = fetch_feed( $url );
if ( isset( $rss->errors ) && ! empty( $rss->errors ) ) {
// do some better error handling like logging the error
var_dump( $rss->errors );
return;
}
if ( ! is_wp_error( $rss ) ) {
$maxitems = $rss->get_item_quantity( -1 ); // get as much items as possible
$rss_items = $rss->get_items( 0, $maxitems );
}
// parsing the feed
foreach ( $rss_items as $item ) {
$fetched_posts[ $item->__toString() ] = array(
\'title\' => $item->get_title(),
\'content\' => $item->get_content(),
\'permalink\' => $item->get_permalink()
);
}
// for debugging
//printf( \'New postcount: %d</p>\', sizeof( $fetched_posts ) );
// store posts in options
update_option( \'fetched_posts\', $fetched_posts );
// return the posts
return $fetched_posts;
}
插件每天获取提要,解析帖子并将其存储在选项表中。显示存储的帖子非常简单:
$posts = FetchPostsClient\\fetch_posts_as_xml( array(), true );
echo \'<ol>\';
array_walk(
$posts,
function( $post ) {
printf(
\'<li><ul><li><a href="%s">%s</a></li><li>%s</li></ul></li>\',
$post[\'permalink\'],
$post[\'title\'],
$post[\'content\']
);
}
);
echo \'</ol>\';
函数返回一个数组,每个帖子都作为数组(标题、永久链接和内容)。您可以将代码放置在模板或小部件中。
Remark
这是“原始”代码。它需要优化,一些值需要清理,等等。不要在你的生产或公共博客中使用它!