技術メモ

マルチサイトで子サイトから記事をまとめて取得する

(更新 )

この記事にはプロモーション(広告)を含みます。 詳しくはこちら

マルチサイトの子サイトの記事をトップページにまとめて表示したかったのでググったところ下記の記事が見つかったので使わせて頂きました。
[blogcard url=”https://securavita.net/get_multisite_posts/”]

取得に関してはこれで問題なかったのですがページングを付ける必要があったので少し手を加えました。

目次
    1. 関数「get_multisite_posts」ページング対応版
    2. 出力する
    3. ページング

関数「get_multisite_posts」ページング対応版

オリジナル版にoffsetを追加しています。

function get_multisite_posts( $args ) {
//サイトの取得
$site = ( !$args['site'] ) ? array( 'site__not_in' => array( 1 ) ) : array( 'site__in' => $args['site'] );
$blogs = get_sites( $site );
 
//カテゴリー
$category = ( !$args['category'] ) ? false : $args['category'];
 
//取得件数
$limit = ( !$args['limit'] ) ? false : $args['limit'];
$offset = ( !$args['offset'] ) ? false : $args['offset'];

global $wpdb;
$sql = '';
foreach( $blogs as $blog ){
    //blog切り替え
    switch_to_blog( $blog->blog_id );
 
    $str = "(SELECT posts.*,%d as blog_id,%s as blog_name".PHP_EOL;
    $str .= "FROM {$wpdb->posts} AS posts".PHP_EOL;
    $sql .= $wpdb->prepare( $str, $blog->blog_id, get_blog_option( $blog->blog_id, 'blogname') );
 
    //termテーブルをjoin
    if( $category ) {
        $sql .= "INNER JOIN {$wpdb->term_relationships} AS term1 ON posts.ID = term1.object_id".PHP_EOL;
        $sql .= "INNER JOIN {$wpdb->term_taxonomy} AS term2 ON term1.term_taxonomy_id = term2.term_taxonomy_id".PHP_EOL;
        $sql .= "INNER JOIN {$wpdb->terms} AS term3 ON term2.term_id = term3.term_id".PHP_EOL;
    }
 
    $sql .= "WHERE posts.post_type = 'post'".PHP_EOL;
 
    //category
    if( $category ) {
        $str = "AND term3.slug = %s".PHP_EOL;
        $sql .= $wpdb->prepare( $str, $category );
        $sql .= "AND term2.taxonomy = 'category'".PHP_EOL;
    }
 
    $sql .= "AND posts.post_status = 'publish')".PHP_EOL;
 
    //次のblogがあるか
    next( $blogs );
    if( current( $blogs ) !== false){
        $sql .= "UNION".PHP_EOL;
    }
 
    restore_current_blog();
}
$limit = ( !$limit ) ? null : $wpdb->prepare( 'LIMIT %d', $limit);
$offset = ( !$offset ) ? null : $wpdb->prepare( 'OFFSET %d', $offset);
$sql .= "ORDER BY post_date DESC {$limit} {$offset}";

$posts = $wpdb->get_results( $sql );
return $posts;
}

出力する

<?php
//表示件数
$limit = 10;
//ページ取得
$paged = get_query_var('paged') ? abs(get_query_var('paged')) : 1;

$args = array(
    'site'      => false,
    'category'  => false,
    'limit'     => $limit,
    'offset'	=> ($paged - 1) * $limit
);
$posts = get_multisite_posts( $args );

foreach( $posts as $post ) :
    switch_to_blog( $post->blog_id );
    setup_postdata( $post );
?>

// $postの内容を表示

<?php
    restore_current_blog();
    endforeach;
    wp_reset_postdata();
?>

ページング

<?php
//表示させるページの範囲
$page_range = 2;
$min_page = max(($paged - $page_range),1);
$max_page = min(($paged + $page_range), $total_pages);
?>

<?php if($paged > 1) : ?>
<li><span><a class="prev page-numbers" href="/page/<?php echo $paged - 1; ?>"> </a></span></li>
<?php if($min_page > 1) : ?>
<li><span><a class="page-numbers" href="/">1</a></span></li>
<li><span><span class="page-numbers dots">…</span></span></li>
<?php endif; ?>
<?php endif; ?>
<?php for($i=$min_page; $i<=$max_page; $i++): ?>
<?php if($i === $paged) : ?>
<li><span><span aria-current="page" class="page-numbers current"><?php echo $i; ?></span></span></li>
<?php else: ?>
<li><span><a class="page-numbers" href="/page/<?php echo $i; ?>"><?php echo $i; ?></a></span></li>
<?php endif; ?>
<?php endfor; ?>
<?php if($paged < $total_pages) : ?>
<?php if($max_page < $total_pages) : ?>
<li><span><span class="page-numbers dots">…</span></span></li>
<li><span><a class="page-numbers" href="/page/<?php echo $total_pages; ?>"><?php echo $total_pages; ?></a></span></li>
<?php endif; ?>
<li><span><a class="next page-numbers" href="/page/<?php echo $paged + 1; ?>"> </a></span></li>
<?php endif; ?>

表示サンプル
1 … 2 3 4 5 6 … 19

多分これでいけている・・・と思う。

コメントを書く

コメントの取り扱いについては、プライバシーポリシーをご覧ください。

CAPTCHA