如何显示来自另一个WordPress安装的帖子?

时间:2013-04-23 作者:Lilap

我环顾四周,似乎找不到这个问题的答案。有类似的问题/答案,但我所看到的没有一个能够回答这个问题,因此如果我错过了这个问题(如果已经被问过),我深表歉意。

我的问题是,是否可以使用同一服务器中的不同数据库从另一个Wordpress安装的类别中提取帖子?

例如

我的主要网站是一个有各种帖子的媒体网站。第二个网站是我们的一个记者网站/博客,在同一台服务器上,不同的数据库和不同的安装。

我们想从“示例类别”中复制/提取他的帖子,并在我们的wordpress页面中显示该帖子。使用与主主题相同的主题,并且不会重定向到第二个wordpress安装。因此,几乎可以将帖子自动复制到主网站。

Wordpress多站点是否会让事情变得更简单,还是应该坚持单一安装?未来我们将有超过10个wordpress博客。

非常感谢。

2 个回复
SO网友:RRikesh

Non-Multisite setup:

您需要创建WPDB Class.

$newWPDB = new wpdb(\'Username\',\'password\',\'database\',\'localhost\');
$rows = $newWPDB->get_results("you-query-here");
<小时/>On WordPress Multisite:

Wordpress多站点是否会让事情变得更简单,还是应该坚持单一安装?

这里有switch_to_blog() 功能可用。你需要restore_current_blog() 在得到结果之后。

请注意,您可以缓存结果,例如使用Transients API, 减少未来请求的服务器负载。

SO网友:Ralf912

正如在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

这是“原始”代码。它需要优化,一些值需要清理,等等。不要在你的生产或公共博客中使用它!

结束