web-dev-qa-db-ja.com

Multisiteで日付別の最近の投稿を取得する

説明のすべてがCDTutsについてのものです

WordPress Networkを作成しました。選択したすべてのサブドメインブログから最近の投稿を取得したいと考えています。私は最新のAllを日付順に整理し、ブログIDで整理しないようにする必要があります。

私はswitch_to_blogを使用したくありません。したがって、foreachを使用します。これは、次に切り替えるブログ内で投稿をループするだけなのでです。私は実際に投稿を組み合わせて、それらをすべて日付順に整理してもらいたいのです。私はあなたがWP_Queryを使用する代わりにmysqlを照会することによってこれをしなければならないだろうと思うでしょう。しかし、私はこれを行うよりネイティブな方法を望んでいました。これは、トップページの一番下に投稿のリストを作成するためのものです。これは、数が増減していないタイムスタンプで見ることができます。

私もこのようなことをやろうとしました、しかしこれはまたうまくいきませんでした。 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を使ってブログのIDを選択できる関数も作成しました。これはフロントページ上部のタイルでのみ機能します。しかし、私は一番下の最新の投稿についても同じことをやろうとしています。最新の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
}
5
Satan

Wordpress multisiteはすべてのブログに対して異なるテーブルを使用するので、すべてのブログを照会し、日付ごとに記事をソートして必要な金額を表示する必要があるため、表示時間にすべてのブログのすべての最近の記事を取得するのは非効率的です。

WordPress Post Indexer( https://premium.wpmudev.org/project/post-index )のようなプラグインは、あなたがそれらを挿入または更新した瞬間に1つの中央dbテーブルにすべての投稿をさらに書く。そこから、あなたはそれらを非常に効率的に問い合わせることができます。

私は自分で言及したプラグインを使用しました - 試す価値があります。私は制作者とは関係ありません。

考慮すべき点がいくつかあります。たとえば、カスタム投稿メタフィールドを表示したい場合は、switch_to_blogを使用する必要があります。

1
jjarolim

でネットワークからの投稿を取得する(Multisite) で私の答えをチェックしてください。私の 'Multisite Post Reader'プラグイン(無料、オープンソース)は、カウント、日付などを制限するオプションを持つすべてのサブサイトからのすべての投稿を取得します。

@jjarolimで述べられているように、それはおそらく少し「重い」(非効率的)ですが、おそらくコードはあなたの努力を助けるでしょう。

0
Rick Hellewell

私はこの質問がかなり「古い」ことを認識しています、しかし私は解決策を思い付きました。

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 );

}

私はそれを短くそして要点を守った。ただし、複数の投稿タイプや投稿ステータスなどを許可することでこれを拡張できます。

現在、上記のこの機能を使用して、投稿タイプ、投稿ステータス、および並べ替えを制御できます。

ソート可能なオプション:

  • 投稿ID
  • 記事のタイトル
  • スラッグを投稿
  • 公開日後
  • 変更後の日付
  • 投稿者ID
  • ブログID

特定のニーズを満たすためにオーバーライドする引数のリストについては、デフォルトの引数を調べてください。

ネットワーク全体で投稿を取得する必要がある可能性がある状況で、誰かがベースを使用する可能性のある解決策としてこれを共有すると思いました。

また、すべてではなくPost IDを返すように修正することもできます。それから、メタクエリや分類クエリなどのようなもっと複雑なもののためにnew WP_Query();でポストIDを使うことができます。

誰かがこれが役に立つことを願っています。

0
Michael Ecklund