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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

0回答

2672閲覧

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

kyapiy

総合スコア16

WordPress

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

PHP

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

0グッド

0クリップ

投稿2016/09/07 00:07

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

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

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

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

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

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

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

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


index.php

PHP

1<?php 2 require('network_post.php'); 3 //一覧の取得。wp_pagenavi を利用するため、affect_wp_query=true とする 4 $posts = network::get_posts('affect_wp_query=true'); 5 global $previousday; 6?> 7<?php if( !empty($posts)): ?> 8 <?php 9 foreach ($posts as $post): 10 network::setup_postdata_and_switch_to_blog( $post ); 11 $previousday = ''; 12 ?> 13 <article class="post" id="post-<?php the_ID(); ?>" <?php post_class(); ?>> 14 <div class="column-1"> 15 <a href="<?php the_permalink(); ?>"> 16 <div class="thumbnail"> 17 <?php if(has_post_thumbnail()): ?> 18 <?php the_post_thumbnail(); ?> 19 <?php else:?> 20 <img class="entry def-thumbnail" src="<?php echo esc_url(get_template_directory_uri()); ?>/images/def_thumbnail.png"> 21 <?php endif;?> 22 </div> 23 </a> 24 </div> 25 <div class="column-2"> 26 <p class="p_title"><a href="<?php the_permalink(); ?>"><span><?php the_title(); ?><?php echo get_bloginfo( $post->blog_id); ?></span></a></p> 27 <p style="text-indent: 0; text-align: right;"><small class="p_date"><?php the_date('m/d H:i');?></small></p> 28 <div class="excerpt"> 29 <?php the_excerpt(); ?> 30 </div> 31 </div> 32 </article> 33 <?php restore_current_blog(); endforeach; ?> 34<?php else: ?> 35 <p>記事が見つかりませんでした。。。</p> 36<?php endif; ?> 37<?php if(!is_mobile()) wp_pagenavi(); ?>

network_post.php

php

1<?php 2 3class network 4{ 5 /** 6 * ネットワーク上の投稿データを取得します。 7 * @param mixed $args 8 * numberposts 取得する投稿数。デフォルトは 5 9 * offset 取得する投稿のオフセット。デフォルトは false で指定無し。指定すると、paged より優先。 10 * paged 取得する投稿のページ数。get_query_var( 'paged' ) の値または1のいずれか大きな方。 11 * post_type 取得する投稿タイプ。デフォルトは post 12 * orderby 並び替え対象。デフォルトは post_date 13 * order 並び替え順。デフォルトは DESC で降順 14 * post_status 投稿のステータス。デフォルトは publish 15 * blog_ids 取得するブログのIDを指定。デフォルトは null で指定無し 16 * exclude_blog_ids 除外するブログのIDを指定。デフォルトは null で指定無し 17 * affect_wp_query wp_query を書き換えるか否か。デフォルトは false で書き換えない。wp_pagenavi など wp_query を参照するページャープラグインの利用時には true とする 18 * @return array<stdClass> 19 */ 20 function get_posts( $args=null ) { 21 22 global $wpdb; 23 24 $args = wp_parse_args( $args, array( 25 'numberposts' => 10, 26 'offset' => false, 27 'paged' => max(1, get_query_var('paged')), 28 'post_type' => 'post', 29 'orderby' => 'post_date', 30 'order' => 'DESC', 31 'post_status' => 'publish', 32 'blog_ids' => null, 33 'exclude_blog_ids' => null, 34 'affect_wp_query' => false, 35 ) ); 36 extract( $args ); 37 38 //ページ指定とオフセットの調整 39 if ( $offset === false ) { 40 $offset = ( $paged - 1 ) * $numberposts; 41 } 42 43 //ブログの一覧を取得 44 $blogs = self::get_blogs( compact( 'blog_ids', 'exclude_blog_ids' ) ); 45 46 //投稿データを取得するサブクエリの準備 47 $sub_queries = array(); 48 foreach ( $blogs as $blog ) { 49 $blog_prefix = ( $blog->blog_id == 1 ) ? '' : $blog->blog_id . '_'; 50 $sub_queries[] = implode(' ', array( 51 sprintf( 'SELECT %3$d as blog_id, %1$s%2$sposts.* FROM %1$s%2$sposts', 52 $wpdb->prefix, $blog_prefix, $blog->blog_id ), 53 $wpdb->prepare('WHERE post_type = %s AND post_status = %s', 54 $post_type, $post_status), 55 )); 56 } 57 58 //クエリの組み立て 59 $query[] = 'SELECT SQL_CALC_FOUND_ROWS *'; 60 $query[] = sprintf( 'FROM (%s) as posts', implode( ' UNION ALL ', $sub_queries ) ); 61 $query[] = sprintf( 'ORDER BY %s %s', $orderby, $order ); 62 $query[] = sprintf( 'LIMIT %d, %d', $offset, $numberposts ); 63 $query = implode( ' ', $query ); 64 65 //問い合わせの実行 66 global $wpdb; 67 $posts = $wpdb->get_results( $query ); 68 $foundRows = $wpdb->get_results( 'SELECT FOUND_ROWS() as count' ); 69 $foundRows = $foundRows[0]->count; 70 71 //wp_query の書き換え 72 if ( $affect_wp_query ) { 73 global $wp_query; 74 $wp_query->query_vars['posts_per_page'] = $numberposts; 75 $wp_query->found_posts = $foundRows; 76 $wp_query->max_num_pages = ceil( $foundRows / $numberposts ); 77 } 78 79 return $posts; 80 } 81 82 /** 83 * ブログの一覧を取得する。 84 * 返される各ブログの情報を持つオブジェクトは、ブログ名とその Home URL を含む。 85 * @param mixed $args 86 * blog_ids 取得するブログのIDを指定。デフォルトは null で指定無し 87 * exclude_blog_ids 除外するブログのIDを指定。デフォルトは null で指定無し 88 * @return array<stdClass> 89 */ 90 function get_blogs( $args=null ) { 91 92 global $wpdb; 93 94 $args = wp_parse_args( $args, array( 95 'blog_ids' => null, 96 'exclude_blog_ids' => null, 97 ) ); 98 extract( $args ); 99 100 //必要に応じて、where 句を準備 101 $where = array(); 102 if ( $blog_ids ) { 103 if ( is_array( $blog_ids ) ) { 104 $blog_ids = array_map( 'intval', (array) $blog_ids ); 105 $blog_ids = implode( ',', $blog_ids ); 106 } 107 $where[] = sprintf( 'blog_id IN (%s)', $blog_ids ); 108 } 109 if ( $exclude_blog_ids ) { 110 if ( is_array( $exclude_blog_ids ) ) { 111 $exclude_blog_ids = array_map( 'intval', (array) $exclude_blog_ids ); 112 $exclude_blog_ids = implode( ',', $exclude_blog_ids ); 113 } 114 $where[] = sprintf( 'blog_id NOT IN (%s)', $exclude_blog_ids ); 115 } 116 117 //クエリの組み立て 118 $query[] = sprintf( 'SELECT * FROM %sblogs', $wpdb->prefix ); 119 if ( $where ) { 120 $query[] = "WHERE " . implode(' AND ', $where); 121 } 122 $query[] = 'ORDER BY blog_id'; 123 $query = implode( ' ', $query ); 124 125 //問い合わせの実行 126 $blogs = $wpdb->get_results( $query ); 127 128 //各ブログの情報を取得 129 foreach ( $blogs as &$blog ) { 130 switch_to_blog( $blog->blog_id ); 131 $blog->name = get_bloginfo('name'); 132 $blog->home_url = get_home_url(); 133 restore_current_blog(); 134 } 135 136 return $blogs; 137 } 138 139 /** 140 * 投稿データをブログとともにセットアップする。 141 * 内部的に switch_to_blog を使っているので、呼び出した後の処理が終わったら、 142 * restore_current_blog() を都度コールする 143 * @param array $post 投稿データ。$post->blog_id を保持していること。 144 * @return void 145 */ 146 function setup_postdata_and_switch_to_blog( $post ) { 147 switch_to_blog( $post->blog_id ); 148 $post->blog_name = get_bloginfo( 'name' ); 149 $post->blog_home_url = get_home_url(); 150 setup_postdata( $post ); 151 } 152 153}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問