サポート » 使い方全般 » 複数ディレクトリのWP記事を非WPディレクトリに表示したい

  • Nana

    (@nanacojima)


    単一ディレクトリのWP記事を非WPディレクトリに表示するには
    wp-load.phpをrequireすることで解決したのですが、
    複数ディレクトリのWP記事で同様の処理を行うと、
    最初にrequireした方の記事しか表示されません。

    例)※newsとblogにWPを実装
    aaa.com/news/
    aaa.com/blog/

    たとえばトップページで

    require(‘news/wp-load.php’);
    query_posts();
    the_title();

    require(‘blog/wp-load.php’);
    query_posts();
    the_title();

    とした場合(かなり略してますが)
    blogの方にもnewsの記事が表示されます。
    requireの記述をフルパスにしても同じでした。

    wp-load.phpで読み込んでいるwp-config.phpを
    フルパスにするなどいろいろ試みたのですが、
    やはりダメでした。

    同じようにwp-load.phpを使って
    複数ディレクトリのWP記事を読み込むことに
    成功されている方がいらしたら、ご教示いただければ幸いです。

    あちこち調べたのですが、どれも単一ディレクトリ…
    またはRSSで読み込み…

    できればWPの機能を使ってシンプルに仕上げたいと考えています。
    ご教示のほど、よろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全27件中)
  • モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    wp_reset_query();の書き忘れとかではないでしょうか?

    トピック投稿者 Nana

    (@nanacojima)

    >mypacecreatorさま
    早々のご回答、ありがとうございます。
    wp_reset_query()については以下のように記述しています。

    <ul>
    <?php require(‘news/wp-blog-header.php’); ?>
    <?php query_posts(‘cat=1&posts_per_page=5’); ?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    <?php wp_reset_query(); ?>
    </ul>
    <ul>
    <?php require(‘blog/wp-blog-header.php’); ?>
    <?php query_posts(‘cat=1&posts_per_page=5’); ?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    <?php wp_reset_query(); ?>
    </ul>

    上記が該当部分の全ソースなのですが、
    問題があればご指摘いただければ幸いです。

    どうぞ、よろしくお願いいたします。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    あ、これ、2つの異なるWordPressの情報を1ファイルに混在させようとしているんですよね。
    勘違いしてましたすみません。

    そうすると、同一ファイル内に
    <?php require('news/wp-blog-header.php'); ?>

    <?php require('blog/wp-blog-header.php'); ?>
    があるのはおかしいような気がします。

    wp_reset_queryは、ループのクエリはリセットしますがrequireしたwp-blog-header.phpまではリセットしないと思うので。

    じゃぁどうするんだと言われると困っちゃいますが、新着記事のタイトル・本文をちょちょいと読み込みくらいだったらwp_rss使った方がシンプルに仕上がると思います。
    単に自分だったらそうするってだけですが。

    (ちなみに一般的にはwp-blog-header.phpじゃなく最初に書いていただいたwp-load.phpの方でいいと思います)

    トピック投稿者 Nana

    (@nanacojima)

    >mypacecreatorさま
    たびたびのご回答、ありがとうございます。

    なるほど…複数ディレクトリのWPを読み込む場合は、
    単純なwp-load.phpでは難しいんですね。

    ご紹介いただいたwp_rss、試してみたいとおもいます。
    迅速かつていねいなご回答、本当にありがとうございました。

    追伸
    もし、他の方法でご提案いただける方がいらっしゃいましたら、
    引き続き、ご教示いただければ幸いです。

    この疑問、私もです。マルチは、デメリット多いとのことで、セパレートにしてデータ取得したいので、同じようにあちこち調べてますが、いまだ、解決できず。

    いくつかのプラグインも試してみたけど、エラーメッセージが山ほど出たり、何も反応しなかったりで困ってます。プラグインに頼らずできる方法と思い調べていたら、他のところで、それぞれのWPで~.phpを作成して、それを静的ページに表示しては?というのがあったのでTryしてますが、できずに。。。。以下のようなところで停止しています。

    ① ./wp01/indexphp ← wp01内のリストソースだけ準備
    ② ./wp02/indexphp ← wp02内のリストソースだけ準備
    ③ index.php ← ①と②を表示

    ■③のHeaderの上に以下を追加
    <?php require(‘./wordpress02/wp-load.php’); (‘./wordpress02club/wp-load.php’); ?>

    ■表示したい箇所に以下を追加
    <div class=”box”>
    <?php include(‘./wp01/index.php’);?>
    </div>
    —–
    <div class=”box”>
    <?php include(‘./wp02/index.php’);?>
    </div>

    ■結果
    wp01は、表示される
    wp02は、表示されない

    ■エラーメッセージ
    Notice: Constant WP_USE_THEMES already defined in C:\xampp\htdocs\●●\wp02\index.php on line 14

    テーマの問題なのか?とか。。。
    ホントにサルなので、困ってます。

    あ、ちなみに上記の①にも②にもふたつずつのリストソースを引いているので、
    結果、4つのデータを表示する感じです。
    EventOrganiserのイベントリスト表示+投稿リストでワンセット

    wp01↓      wp02↓
    イベントリスト |イベントリスト
    投稿リスト   |投稿リスト

    wp01/indexphp 
    wp02/indexphp 
    がwordpressのテーマではなくただのphpファイルで存在すると仮定して
    各indexphpのほうでwp-load.phpをインクルードして
    メインindex.phpのほうでwp01とwp02をインクルードではどうでしょうか?

    やはりRSSを読み込んだほうが楽だとは思いますが。

    紹介されているsimplepieを使おうとすると以下のような大量のエラーが出たりするんですよ。
    Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\htdocs~~~~~~

    この時点までは、テキストデータ読めてるんですよね。
    ① ./wp01/indexphp ← wp01内のリストソースだけ準備
    ② ./wp02/indexphp ← wp02内のリストソースだけ準備

    最後の以下のところで②のデータだけ拾えないんです。
    >メインindex.phpのほうでwp01とwp02をインクルードではどうでしょうか?

    そして、RSSは、xamppのローカルだけでやっているので、そのどこかに問題があるのか?です。
    う~、できない。

    アイディアだけです。

    まず、include、require するファイルについてですが、PHP(だけでなく他の言語でも同じですが)ではいったん定義した定数を変更、リセットすることができません。変更できたら、constant じゃなくて variable になっちゃいますからね。何が起こっているかは、下のコードを実行するとわかると思います。

    ini_set('error_reporting', E_ALL);
    require_once('./wp01/wp-load.php');
    require_once('./wp02/wp-load.php');
    echo ABSPATH;

    Notice とともに、wp01 の ABSPATH が表示されるはずです。同様に、

    Notice: Constant WP_USE_THEMES already defined in C:\xampp\htdocs\●●\wp02

    も、テーマのエラーではなくて、定数のエラーです。これは fatal error ではないので、スクリプトの実行は止まらず、後に続くコードを実行し続けますが、ユーザからは何が起こっているか見えません。

    これらは何を意味するか、というと、先に読み込んだ WordPress しか使えないということです。つまり、この手法は、PHP を使う限り成功しません。定数を全て変数に書き換えた WordPress を自作すればできますが、だれもやりたいと思わないですよね。

    ということで、fetch_feed() を使わずにやる方法を考えてみました。なお、wp_rss() は deprecated になりましたので、使わないようにしましょう。やりたいことは、複数のデータベースやテーブルからデータを取って、使いたいというだけですから、mysql か mysqli を使って自前のクエリを書くのが一番簡単ですが、何をやっているのか、具体的なコードがないので、わかりませんし、WordPress のテーマを使ったり、その関数を使ったりするみたいですので、上の方法を少し変えてやってみます。

    候補1(お手軽prefix change):
    2つの WordPress が同一のデータベースを使い、prefix だけがことなる場合。wp02 の prefix が wp02_ と仮定してあります。

    require_once('./wp01/wp-load.php');
    
    //ここで、wp01 用のコードを実行。
    
    global $wpdb;
    $orig_prefix = $wpdb->set_prefix('wp02_');
    
    //ここで、wp02 のコードを実行。
    
    $wpdb->set_prefix($orig_prefix); // もとに戻すときにはこれを使う

    候補2(db change + prefix change):
    2つの WordPress が異なるデータベースを使っていて、ユーザ名、パスワード、ホストが同じ場合。

    require_once('./wp01/wp-load.php');
    
    //ここで、wp01 用のコードを実行
    
    global $wpdb;
    $dbname = 'データベース名';
    $wpdb->select($dbname);
    $orig_prefix = $wpdb->set_prefix('wp02_');
    
    //ここで、wp02 用のコードを実行
    
    $wpdb->select(DB_NAME); // もとに戻すときにはこれを使う
    $wpdb->set_prefix($orig_prefix);

    候補3(create a new instance and a little dangerous):
    2つの WordPress が異なるデータベースを使っていて、ユーザ名、パスワード、ホストが異なる場合。まず、データベース情報ファイルを作ります。ウェブルートには置かず、ユーザ以外には読めないパーミッションにしてください。

    /* secret.php set to permission 0400 */
    $dbuser     = ''; // ユーザ名
    $dbpassword = ''; // パスワード
    $dbname     = ''; // データベース名
    $dbhost     = ''; // ホスト名
    /* end of secret.php */

    index.php は下のようになります。wp01 を間借りして wp02 を実行するみたいな感じですかね。

    require_once('./wp01/wp-load.php');
    
    //ここで、wp01 用のコードを実行
    
    require_once('../secret.php');
    global $wpdb;
    unset($wpdb);
    $wpdb = new wpdb($dbuser, $dbpassword, $dbname, $dbhost);
    $wpdb->set_prefix('wp02_');
    
    //ここで、wp02 用のコードを実行

    まずは、候補1(お手軽prefix change)=エラーは消えましたが、真っ白。次!

    候補2
    2つの WordPress が異なるデータベースを使っていて、
    ユーザ名、パスワード、ホストが同じ場合。

    これなはずなんですけど、んんんん。真っ白、なぜだ。。。すみません、めちゃくちゃ丁寧に教えて頂いているのに。。。
    http://localhost2/index.php
    <?php include(‘./ws01/index.php’);?> ← http://localhost2/ws01/index.php
    <?php include(‘./ws02/index.php’);?> ← http://localhost2/ws02/index.php 
          ↑ ※こっちを書き換えています。ですよね?

    以下の強調か所のみ書き換えていますが、真っ白のままです。
    エラーはなしです。

    <?php
    require_once(‘./wp01/wp-load.php’);

    //ここで、wp01 用のコードを実行

    global $wpdb;
    $dbname = ‘wp02‘;
    $wpdb->select($dbname);
    $orig_prefix = $wpdb->set_prefix(‘wp02_’);

    //ここで、wp02 用のコードを実行

    $wpdb->select(DB_NAME); // もとに戻すときにはこれを使う
    $wpdb->set_prefix($orig_prefix);
    ?>

    ん? 説明、読みませんでしたね。一応補足です。

    1. PHP の仕様として、上のようなことはできません。だから、良い子の回答は「できない」というものです。
    2. WordPress は、こんな使われ方をすることを想定して作られていませんので、WordPress から見ても、「できない」が良い子の回答です。
    3. にもかかわらず、wpdb クラスのインスタンスを本来の目的とは違う形で利用しようというのが上のコードです。

    これが前提です。保証はありません。WordPress も保証していません。自力でコードを理解してください。

    候補1~3は、条件に合うものを使わなければ動作しません。何度やっても同じ結果で、時間の無駄です。コードを書くのは

    root--+--wp01--+--index.php
           |
           +--wp02--+--index.php
           |
           +--index.php(ここ)

    です。自分で何をしているのか 100% 理解していて、問題に対処できるのであれば別ですが、WordPress の index.php はもとの状態に戻してください。私のお勧めは、次の2つです。

    1. fetch_feed() を使う。
    2. あきらめる。

    あれ? データベース名が wp02 で prefix も wp02_ ですか? これ、違ってませんか?

15件の返信を表示中 - 1 - 15件目 (全27件中)
  • トピック「複数ディレクトリのWP記事を非WPディレクトリに表示したい」には新たに返信することはできません。