質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • PHP

    24074questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    8944questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

マルチサイトにて、親サイトに全子サイトの記事を表示させている時に2ページ目以降が404エラーとなるが内容は表示される

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 978

kyapiy

score 10

閲覧ありがとうございます。
現在、「マルチサイト機能」にてサブドメイン型で親・子関係となるサイトを構築しています。

親サイトのトップページに、サイトネットワーク中の全記事のリスト(親サイトと子サイト全て)を表示させています。記事数自体はすでにあわせて100を超えているので、ページが存在しないことはないのですが、

http://example.com/page/2/

にアクセスすると記事一覧は取得できページ内容が表示されるのですが、HTTPステータスコードは404となってしまいます。

404がリターンされる原因として、調べたところ「wordpress的に存在しないディレクトリへのアクセス」のためだという回答が一番現実的だと思いました。

親サイトに「親サイトの投稿と全子サイトの投稿」をページネーション付きで表示し、2ページ目以降も正常に表示させるためにどのように改善すれば良いのか検討がつきません。
そもそも、親ページに投稿されていない記事をページネーションするという方針が間違っているのかもしれません。

記事表示ループとクエリ部分のソースコードを添付しますので、改善方法をご教授いただけませんでしょうか。

現状の環境は、
wordpress: 4.6
php: 5.6.22
パーマリンク設定: 日付と投稿名
です。


index.php

<?php
    require('network_post.php');
    //一覧の取得。wp_pagenavi を利用するため、affect_wp_query=true とする
    $posts = network::get_posts('affect_wp_query=true');
    global $previousday;
?>
<?php if( !empty($posts)): ?>
    <?php
        foreach ($posts as $post):
            network::setup_postdata_and_switch_to_blog( $post );
            $previousday = '';
    ?>
        <article class="post" id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                                        <div class="column-1">
                <a href="<?php the_permalink(); ?>">
                    <div class="thumbnail">
                        <?php if(has_post_thumbnail()): ?>
                            <?php the_post_thumbnail(); ?>
                        <?php else:?>
                            <img class="entry def-thumbnail" src="<?php echo esc_url(get_template_directory_uri()); ?>/images/def_thumbnail.png">
                        <?php endif;?>
                    </div>
                </a>
            </div>
            <div class="column-2">
                <p class="p_title"><a href="<?php the_permalink(); ?>"><span><?php the_title(); ?><?php echo get_bloginfo( $post->blog_id); ?></span></a></p>
                <p style="text-indent: 0; text-align: right;"><small class="p_date"><?php the_date('m/d H:i');?></small></p>
                <div class="excerpt">
                    <?php the_excerpt(); ?>
                </div>
            </div>
        </article>
    <?php restore_current_blog(); endforeach; ?>
<?php else: ?>
    <p>記事が見つかりませんでした。。。</p>
<?php endif; ?>
<?php if(!is_mobile()) wp_pagenavi(); ?>

network_post.php

<?php

class network
{
    /**
     * ネットワーク上の投稿データを取得します。
     * @param  mixed  $args
     *    numberposts    取得する投稿数。デフォルトは 5
     *    offset    取得する投稿のオフセット。デフォルトは false で指定無し。指定すると、paged より優先。
     *    paged    取得する投稿のページ数。get_query_var( 'paged' ) の値または1のいずれか大きな方。
     *    post_type    取得する投稿タイプ。デフォルトは post
     *    orderby    並び替え対象。デフォルトは post_date
     *    order    並び替え順。デフォルトは DESC で降順
     *    post_status    投稿のステータス。デフォルトは publish
     *    blog_ids    取得するブログのIDを指定。デフォルトは null で指定無し
     *    exclude_blog_ids    除外するブログのIDを指定。デフォルトは null で指定無し
     *    affect_wp_query    wp_query を書き換えるか否か。デフォルトは false で書き換えない。wp_pagenavi など wp_query を参照するページャープラグインの利用時には true とする
     * @return  array<stdClass>
     */
    function get_posts( $args=null ) {

        global $wpdb;

        $args = wp_parse_args( $args, array(
            'numberposts' => 10,
            'offset' => false,
            'paged' => max(1, get_query_var('paged')),
            'post_type' => 'post',
            'orderby' => 'post_date',
            'order' => 'DESC',
            'post_status' => 'publish',
            'blog_ids' => null,
            'exclude_blog_ids' => null,
            'affect_wp_query' => false,
        ) );
        extract( $args );

        //ページ指定とオフセットの調整
        if ( $offset === false ) {
            $offset = ( $paged - 1 ) * $numberposts;
        }

        //ブログの一覧を取得
        $blogs = self::get_blogs( compact( 'blog_ids', 'exclude_blog_ids' ) );

        //投稿データを取得するサブクエリの準備
        $sub_queries = array();
        foreach ( $blogs as $blog ) {
            $blog_prefix = ( $blog->blog_id == 1 ) ? '' : $blog->blog_id . '_';
            $sub_queries[] = implode(' ', array(
                sprintf( 'SELECT %3$d as blog_id, %1$s%2$sposts.* FROM %1$s%2$sposts', 
                    $wpdb->prefix, $blog_prefix, $blog->blog_id ),
                $wpdb->prepare('WHERE post_type = %s AND post_status = %s', 
                    $post_type, $post_status),
            ));
        }

        //クエリの組み立て
        $query[] = 'SELECT SQL_CALC_FOUND_ROWS *';
        $query[] = sprintf( 'FROM (%s) as posts', implode( ' UNION ALL ', $sub_queries ) );
        $query[] = sprintf( 'ORDER BY %s %s', $orderby, $order );
        $query[] = sprintf( 'LIMIT %d, %d', $offset, $numberposts );
        $query = implode( ' ', $query );

        //問い合わせの実行
        global $wpdb;
        $posts = $wpdb->get_results( $query );
        $foundRows = $wpdb->get_results( 'SELECT FOUND_ROWS() as count' );
        $foundRows = $foundRows[0]->count;

        //wp_query の書き換え
        if ( $affect_wp_query ) {
            global $wp_query;
            $wp_query->query_vars['posts_per_page'] = $numberposts;
            $wp_query->found_posts = $foundRows;
            $wp_query->max_num_pages = ceil( $foundRows / $numberposts );
        }

        return $posts;
    }

    /**
     * ブログの一覧を取得する。
     * 返される各ブログの情報を持つオブジェクトは、ブログ名とその Home URL を含む。
     * @param  mixed  $args
     *    blog_ids  取得するブログのIDを指定。デフォルトは null で指定無し
     *    exclude_blog_ids  除外するブログのIDを指定。デフォルトは null で指定無し
     * @return  array<stdClass>
     */
    function get_blogs( $args=null ) {

        global $wpdb;

        $args = wp_parse_args( $args, array(
            'blog_ids' => null,
            'exclude_blog_ids' => null,
        ) );
        extract( $args );

        //必要に応じて、where 句を準備
        $where = array();
        if ( $blog_ids ) {
            if ( is_array( $blog_ids ) ) {
                $blog_ids = array_map( 'intval', (array) $blog_ids );
                $blog_ids = implode( ',', $blog_ids );
            }
            $where[] = sprintf( 'blog_id IN (%s)', $blog_ids );
        }
        if ( $exclude_blog_ids ) {
            if ( is_array( $exclude_blog_ids ) ) {
                $exclude_blog_ids = array_map( 'intval', (array) $exclude_blog_ids );
                $exclude_blog_ids = implode( ',', $exclude_blog_ids );
            }
            $where[] = sprintf( 'blog_id NOT IN (%s)', $exclude_blog_ids );
        }

        //クエリの組み立て
        $query[] = sprintf( 'SELECT * FROM %sblogs', $wpdb->prefix );
        if ( $where ) {
            $query[] = "WHERE " . implode(' AND ', $where);
        }
        $query[] = 'ORDER BY blog_id';
        $query = implode( ' ', $query );

        //問い合わせの実行
        $blogs = $wpdb->get_results( $query );

        //各ブログの情報を取得
        foreach ( $blogs as &$blog ) {
            switch_to_blog( $blog->blog_id );
            $blog->name = get_bloginfo('name');
            $blog->home_url = get_home_url();
            restore_current_blog();
        }

        return $blogs;
    }

    /**
     * 投稿データをブログとともにセットアップする。
     * 内部的に switch_to_blog を使っているので、呼び出した後の処理が終わったら、
     * restore_current_blog() を都度コールする
     * @param  array  $post  投稿データ。$post->blog_id を保持していること。
     * @return void
     */
    function setup_postdata_and_switch_to_blog( $post ) {
        switch_to_blog( $post->blog_id );
        $post->blog_name = get_bloginfo( 'name' );
        $post->blog_home_url = get_home_url();
        setup_postdata( $post );
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • PHP

    24074questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    8944questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • トップ
  • PHPに関する質問
  • マルチサイトにて、親サイトに全子サイトの記事を表示させている時に2ページ目以降が404エラーとなるが内容は表示される