在多站点中按日期获取最近发布的帖子

时间:2013-10-04 作者:Satan

所有解释都是关于CDTuts

我创建了一个WordPress Network 我想从所有选定的子域博客中获取最近的帖子。我需要最新的All 按日期组织,不按博客ID组织。

我不想使用switch_to_blog 因此,使用foreach,因为我只在我切换的下一个博客中循环帖子。我想把这些帖子合并起来,按日期组织起来。我想您必须通过查询mysql而不是使用WP\\U查询来实现这一点。但我希望有一种更地道的方式来做这件事。这是要在首页底部制作的帖子列表,您可以看到,时间戳不是按数字的大小升序或降序。

我甚至试过这样做,但这也行不通。按Unix时间戳对帖子进行排序,以仅了解帖子仍按switch_to_blog 而不是及时。

<?php           
    switch_to_blog(1);
    $main_posts = get_posts();
    switch_to_blog(2);
    $php_posts = get_posts();
    switch_to_blog(3);
    $wp_posts = get_posts();
    switch_to_blog(4);
    $mac_posts = get_posts();
    switch_to_blog(4);
    $psd_posts = get_posts();
    switch_to_blog(1);

    $posts = array_merge($main_posts, $php_posts, $wp_posts, $mac_posts, $psd_posts);
    usort($post, get_post_time);

    foreach($posts as $post){
    ?>
        <li class="thumb"><a href="<?php echo the_permalink(); ?>">
            <div class="site-name">
            </div>
            <div class="title">
                <?php echo the_title(); ?><br> <?php echo get_post_time(); ?>
            </div>
        </a></li>
    <?php }         
?>
我还创建了一个函数,可以使用switch_to_blog. 这只适用于首页顶部的平铺。但我也在尝试对底部的最新帖子进行同样的处理。我无法创建偏移量,以便在保留6篇最新帖子的同时保留互动程序设计。

这是基于之前的回答StackExchange

function global_latest_post($LatestBlogNumber,$LatestPostNumber, $LatestThumbSize, $LatestThumbNumber) {
    $original_blog_id = get_current_blog_id();
    $bids = array($LatestBlogNumber);    

    foreach($bids as $bid) {
        switch_to_blog($bid);
        $tiles = new WP_Query(\'posts_per_page=1\');
        while ($tiles->have_posts()) : $tiles->the_post(); ?>
            <a href="<?php echo the_permalink(); ?>" class="<?php echo $LatestThumbSize; ?> thumb-<?php echo $LatestThumbNumber; ?>">
                <p class="cover">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
                <p class="bold bottom">Read More &rarr;</p>
                <h1><?php echo $LatestPostNumber; ?>. <?php echo the_title(); ?> in <?php bloginfo(\'name\'); ?></h1>
            </a>
        <?php           
        endwhile;
    }
    switch_to_blog( $original_blog_id ); //switched back to current blog
}

3 个回复
SO网友:jjarolim

由于wordpress multisite对所有博客使用不同的表,因此在显示时间获取所有博客的所有最新文章(内容聚合)是非常低效的,因为您必须查询所有博客,按日期对文章进行排序,并显示所需的数量。

WordPress Post Indexer等插件(https://premium.wpmudev.org/project/post-indexer) 另外,在插入或更新帖子时,将所有帖子写入一个中央db表。从那里,您可以非常高效地查询它们。

我自己使用了上面提到的插件,值得一试。我与造物主无关。

还有一些事情需要考虑:例如:如果您想显示自定义的post元字段,则必须使用switch\\u to\\u blog。

SO网友:Michael Ecklund

我意识到这个问题相当“古老”,然而,我想出了一个解决办法。

可以从多站点网络中的其他博客检索帖子,而无需使用switch_to_blog();restore_current_blog();.

/**
 * This is an example of retrieving posts from multiple blogs in Multisite.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 * @param array $user_args
 *
 * @return array|bool|null|object
 */
function mbe_get_network_posts( Array $user_args = Array() ) {

    if ( ! is_multisite() ) {
        return false;
    }

    $default_args = array(
        \'post_type\'   => \'post\',
        \'post_status\' => \'publish\',
        \'limit\'       => absint( get_option( \'posts_per_page\' ) ),
        \'orderby\'     => \'post_date\',
        \'order\'       => \'DESC\'
    );

    $args = wp_parse_args( $user_args, $default_args );

    $args[\'orderby\'] = strtolower( $args[\'orderby\'] );
    $args[\'order\']   = strtoupper( $args[\'order\'] );

    if ( ! in_array( $args[\'orderby\'], array(
        \'id\',
        \'post_title\',
        \'post_name\',
        \'post_date\',
        \'post_modified\',
        \'post_author\',
        \'blog_id\'
    ) ) ) {
        return false;
    }

    if ( ! in_array( $args[\'order\'], array(
        \'ASC\',
        \'DESC\'
    ) ) ) {
        return false;
    }

    global $wpdb;

    if ( ! $blog_ids = $wpdb->get_col( "SELECT DISTINCT blog_id FROM {$wpdb->blogs}" ) ) {
        return false;
    }

    $queries = array();

    $where = array(
        \'post_type\'   => $wpdb->prepare( "AND post_type = %s", $args[\'post_type\'] ),
        \'post_status\' => $wpdb->prepare( "AND post_status = %s", $args[\'post_status\'] ),
    );

    foreach ( $blog_ids as $blog_id ) {

        if ( $blog_id == 1 ) {
            $prefix = substr( $wpdb->base_prefix, 0, - 1 );
        } else {
            $prefix = $wpdb->base_prefix . $blog_id;
        }

        $queries[] = $wpdb->prepare(
            "
            ( 
                SELECT *, {$blog_id} AS blog_id
                FROM {$prefix}_posts
                WHERE 1=1 " . join( " ", $where ) . "
                ORDER BY {$args[\'orderby\']}
                {$args[\'order\']}
                LIMIT %d
            )
            ",
            absint( $args[\'limit\'] )
        );

    }

    $query = join( "UNION", $queries ) . "ORDER BY {$args[\'orderby\']} {$args[\'order\']}";

    return $wpdb->get_results( $query );

}
我把它写得简短而中肯。然而,您可以对此进行扩展,允许多种帖子类型或帖子状态等。

目前,通过上述功能,您可以控制帖子类型、帖子状态和排序方式:

Sortable Options:

  • 帖子ID
  • 帖子标题
  • Post Slug
  • 帖子发布日期
  • 帖子修改日期
  • 帖子作者ID
  • 博客ID
    • 查看默认参数以获取要覆盖的参数列表,以满足您的特定需要。

      我想我会将此作为一种可能的解决方案分享给其他人,让他们在任何情况下都可以使用base,在这种情况下,您可能需要在网络范围内检索帖子。

      此外,您可以修改它以返回帖子ID,而不是返回所有内容。那么,你可以在new WP_Query(); 对于更复杂的东西,如元查询和/或分类查询等。

      希望有人觉得这有用。

SO网友:Rick Hellewell

查看我的答案Get posts from Network (Multisite) . 我的“Multisite Post Reader”插件(免费、开源)从所有子网站获取所有帖子,并提供限制数量、日期等选项。

正如@jjarolim所提到的,这可能有点“沉重”(效率低下),但代码可能会帮助您的工作。

结束

相关推荐

SQL/wp_UPDATE_POST:将POST自定义字段更改为CPT POST分类

设置如下:我有带有自定义字段的帖子:actor = \'tom hanks\'对于高级管理,我创建了一个自定义的帖子类型(actors),并在actors分类中添加了“tomhanks”作为帖子。通过插件“高级自定义字段”,我将自定义分类法(actors)连接到默认帖子,这样我就可以在常规帖子页面上选择“TomHanks”。这可以手动完成(检查自定义字段值并单击相应的actors类别),但有超过1500篇文章和许多其他类似的自定义字段值。您知道如何通过SQL查询或函数来解决这个问题吗?在一行中:get v