• 解決済 yumebunseki

    (@yumebunseki)


    http://ja.forums.wordpress.org/topic/5835?replies=3

    上記のトピックで特定のページを親とするページ群のリストを取得する方法は分かったのですが、これの応用でテンプレート化することを考えて(このテンプレートで子ページを作成すれば良いというテンプレートを作りたい)、

    1:特定のページを親とする子ページ群内同士だけで「前のページへ」「次のページへ」のナビリンクを付けたい。

    2:テンプレートで汎用化する為に親ページのIDは関数で取得してテンプレート内の関数に流し込む形式にしたい。

    3:子ページの数は更新で増えて行く前堤。

    以上の記述の仕方を具体的に教えて頂けるとありがたいです。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • プラグイン Next Page
    http://wordpress.org/extend/plugins/next-page/
    がやりたいことに近いのではないでしょうか。

    子ページだけに「次」「前」を付けたいなら、子ページ用のテンプレートを作るか、ページの親フィールドが 0 でない場合のみテンプレートタグを埋め込めばよいと思います。

    自分で関数を作る場合でも、プラグインの中の
    function flatten_page_list(){]
    function get_next_link(){}
    function get_previous_link(){}
    この辺の関数が参考になると思います。

    トピック投稿者 yumebunseki

    (@yumebunseki)

    >>pluto1234 さん
     返信ありがとうございます。
     さっそくプラグイン Next Page を実装してみましたが、「子ページ間で前後移動できるナビ」は付いたのは希望通りなのですが、前後を挟む親ページに対してまでナビに組み込まれてしまい困っています。

     具体的には、
    ページA
    ページB
     [ページBを親とするページ群]
      ページB-A
      ページB-B
      ページB-C
      ページB-D
      ページB-E
    ページC
    ページD

    という構造で、プラグイン Next Page のナビが入る記述を入れて子ページ用のテンプレートを別に作成、これで子ページを作成。親ページ用のテンプレートにはプラグイン Next Page のナビが入る記述は入れていない。

     この状態でページを構成すると、ページB-Aの「前に」ナビリンクとして「ページBへのリンク」が、ページB-Eの「次へ」のナビリンクに「ページC」のナビリンクが埋め込まれてしまいます。(ページB、ページCへ移動するとナビリンクを付けていないので当然ナビリンク表示は消えるのだが)

     希望としては当初の「子ページ間だけの移動リンク」の設置と共に、「親ページ間だけ(子ページは無視したかたち)の移動リンク」も設置したいと思っているのですが、どうすれば可能になるかお教え頂ければありがたく思います。

    Plugin の説明に
    allowing Drupal-like book navigation.
    とあったので、これだと思いましたが、子供の端っこで親へのリンクが付いてしまうのは、Drupal の Book モジュールとは違うようですね。

    プラグインを適当にいじれば(たぶん、どっかに1,2行条件を加えれば)、B-Aのprev,B-Eのnextのリンクを表示させないようにすることはできると思います。

    モデレーター jim912

    (@jim912)

    yumebunsekiさん、pluto1234さん、こんにちは。

    Next Pageプラグインは、flatten_page_listで全ページのIDの配列を作り、get_next_linkおよびget_previous_linkで現在のページの前後のIDからリンクを生成しています。

    ですので、flatten_page_listで全ページではなく、同じ親ページをもつページのみに限定してしまえばよいことになります。

    flatten_page_list内でのページの取得は、get_pagesを使っていますので、親ページを指定できるparentというパラメータを用い、現在のページの親ページIDである $post->post_parent を指定します。

    具体的には

    function flatten_page_list($exclude = '') {
       $args = 'sort_column=menu_order&sort_order=asc';

    function flatten_page_list($exclude = '') {
       global $post;
       $args = 'sort_column=menu_order&sort_order=asc&parent=' . $post->post_parent;

    と改編すれば、お望みの動作となるのではないでしょうか。

    トピック投稿者 yumebunseki

    (@yumebunseki)

    >>jim912 さん
     有益なご助言ありがとうございます。
     ただ、お提示頂いたコードをそのまま使った処、何も表示されなくなりました。
     この後、色々試す内で、親ページ(正確には子ページとして下階層になっているのではない上位階層ページ群)用のテンプレートにプラグイン Next Page のナビが入る記述を入れてみると「親ページ間だけ(子ページは無視したかたち)の移動リンク」は表示されました。

     そこで、この現象を手掛かりにWordPress Codex(日本語、英語両方)の関数の説明を追っ掛けていって下記記述を思い付きました。で実際実装してみると見事ビンゴ!でした。

    function flatten_page_list($exclude = ”) {
    $args = ‘sort_column=menu_order&sort_order=asc’;

    function flatten_page_list($exclude = ”) {
    global $post;
    if ( is_page() && $post->post_parent ) {
    $args = ‘sort_column=menu_order&sort_order=asc&child_of=’ . $post->post_parent;
    } else {
    $args = ‘sort_column=menu_order&sort_order=asc&parent=’ . $post->post_parent;
    }

    PHP初心者ながらjim912さんの示してくれた記述だと「&parent に 1 が入る($post->post_parent; がture なのだから)」ので、これでget_pagesすると上の階層のリストが返ってくるという結果になったのだろうと推測しましたが、これで合ってますかね?
     だとすると、$post->post_parent; がture で 1 が返ってくるのだから parent を child_of に変えれば良いのではないか?とWordPress Codex EN “get_pages” 読込んでて思い付いた次第。

    jim912さんのコードを見てなるほどと思いましたが、parent を指定した get_pages() に問題があるのか確かにうまくいきません。

    yumebunsekiさんの方法だと、ページB-Bの下に B-B-1,B-B-2,B-B-3 のようなページがあるとうまくいきません。そういうページは作らないなら良いのですが・・。

    get_pages() は使わずに、

    function flatten_page_list($exclude = '') {
        global $wpdb;
        global $post;
    
        $pagelist = $wpdb->get_results( "
            SELECT *
            FROM   $wpdb->posts
            WHERE  post_type = 'page'
                   AND post_parent = $post->post_parent
                   AND post_status = 'publish'
                   ORDER BY menu_order;
        " );
    
       //$pagelist = get_pages($args);
       $mypages = array();
        :

    のようにすると一般的にうまくいくようです。
    (jim912さんの方式をget_pages()を使わずにやっただけです)

    モデレーター jim912

    (@jim912)

    yumebunsekiさん、pluto1234さん、こんにちは。

    すみません。hierarchicalの指定も必要なようでした。試してみて下記のコードで出来るかと思います。

    function flatten_page_list($exclude = '') {
    	global $post;
       $args = 'sort_column=menu_order&sort_order=asc&hierarchical=0&parent=' . $post->post_parent;
       $pagelist = get_pages($args);
    トピック投稿者 yumebunseki

    (@yumebunseki)

    >>pluto1234 さん
    > yumebunsekiさんの方法だと、〜以下略

     それ(孫ページが以下が在ると一緒くたにされる)は、たぶんそうだろうと予想していました。
     ので、より汎用性の在るコードを示して下さってありがとうございます。 助かります。

    >>jim912
    さん
     も同じくで骨折りありがとうございます。 まだ実装して試していないですけど、一先ずお礼まで。

    トピック投稿者 yumebunseki

    (@yumebunseki)

    >>pluto1234 さん
    >>jim912 さん

     ありがとうございました。 どちらも正常動作確認しました(今のこと必要ないけど動作確認のために孫ページを作ってみての動作も)。

     個人的感覚次元ですがpluto1234 さん記述のほうが若干サーバのレスポンスが早いような気がしますのでこちらを採用することにさせて貰います。

     また、ご両人とも、単純にプラグインの改造という点だけでなく、こういう記述のするのだという点で非常にPHP初学者には参考になりました点をお礼申し上げます。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「特定の親ページに属する小ページの情報参照のしかた色々」には新たに返信することはできません。