サポート » 使い方全般 » 子ページに属する孫ページ一覧を作り新着マークを付けたい。

  • 解決済 ringoame

    (@ringoame)


    初めまして。お世話になります。
    固定ページ(子ページ)に、そのページに属する孫ページ一覧を表示させて、新規孫ページに新着マークを付けたいと考えています。

    現在は子ページが10件程度(今後も増える)、孫ページは数え切れないほどあります。
    それぞれ該当の子ページごとに、

    • リンク付き孫ページタイトル カスタムフィールドの値 作成日
    • リンク付き孫ページタイトル カスタムフィールドの値 作成日 new!

    というような感じで子ページに孫ページ一覧を作りたいです。

    現在下記のコードで一覧表示は成功しています。
    (プラグインExec-PHPを使用して、子ページごとに直接記入しています。)

    <ul>
    <?php
        $pages = get_pages('sort_column=post_date&child_of=12345&sort_order=ASC');
        foreach ( $pages as $page ) {
            $option = '<li><a href="' . get_page_link( $page->ID ) . '">';
            $option .= $page->post_title;
            $option .= '</a> ';
            $option .= get_post_meta($page->ID, 'カスタムフィールドの名前', true);
            $option .= '</li>
    ';
            echo $option;
        }
    ?>
    </ul>

    こちらを、さらに上記で書いたような形で、孫ページを作成した日付と新着マークを付けられないかと考えています。

    新着マークは時間経過で消えるようにしたいです。

    <?php
    $days=2;
    $today=date('U'); $entry=get_the_time('U');
    $diff1=date('U',($today - $entry))/43200;
    if ($days > $diff1) {
    echo ' <img src="img/new.gif" />';
    }
    ?>

    試したコード

    <?php
        $pages = get_pages('sort_column=post_date&child_of=12345&sort_order=ASC');
        foreach ( $pages as $page ) {
            $option = '<li><a href="' . get_page_link( $page->ID ) . '">';
            $option .= $page->post_title;
            $option .= '</a> ';
            $option .= get_post_meta($page->ID, 'カスタムフィールドの名前', true);
            $option .= get_the_date('Y.m.d');
            $option .= '</li>
    ';
            echo $option;
        }
    ?>

    これだと、子ページを作成した日付しか表示されませんでした。(当然?)
    他にも色々試しましたが真っ白になるだけで、行き詰まっています。

    孫ページを作成する時に、日付もカスタムフィールドに入れて表示させるしかないでしょうか。
    その場合、時間経過で消える「new!」は無理?

    Codexや検索をしてみましたが、キーワードが悪いのか探しだせませんでした。

    全く別のやり方でも構いませんので、ご教示頂けたら助かります。
    よろしくお願いします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • get_postsで取得したものをそのままforeachで回す場合には
    オブジェクトで入っています。
    get_the_dateはグローバルな$postに対しての関数になるので
    上記の場合ならそのまま
    $page->post_date
    で日時を取得してからphpで判断できるように変換していくか
    setup_postdata
    で$postに設定する必要があります。

    get_postsの用例

    トピック投稿者 ringoame

    (@ringoame)

    返信ありがとうございました!

    <?php
        $pages = get_pages('sort_column=post_date&child_of=17057&sort_order=ASC');
        foreach ( $pages as $page ) {
            $option = '<li><a href="' . get_page_link( $page->ID ) . '">';
            $option .= $page->post_title;
            $option .= '</a> ';
            $option .= get_post_meta($page->ID, 'midasi', true);
            $option .= ' ';
            $option .= mysql2date('Y.m.d', $page->post_date);
            $option .= '</li>
    ';
            echo $option;
        }
    ?>

    ヒントを元に紆余曲折の後、日付はこのようにして何とか出力できました。
    正しいのかどうかもわかりませんが、ここまで出来たので何とか完遂したいです。

    上記の、日時を取得する事につづいてNEWマークを付けることは可能と思われるでしょうか。
    色々やっていますが案の定うまくいかず、またヒントでも頂けたら大変有難いです。
    よろしくお願いします。

    $page->post_date
    はそのままmySQL型なので、比較するのにはstrtotimeが
    一番楽ではないかと思います。
    ringoameさんが提示したコードをちょこっと変えて
    foreach内の目的の場所に書くだけです。

    <?php
    $days=2;
    $today=date('U'); $entry=strtotime($page->post_date);
    $diff1=date('U',($today - $entry))/43200;
    if ($days > $diff1) {
    echo ' <img src="img/new.gif" />';
    }
    ?>

    トピック投稿者 ringoame

    (@ringoame)

    お手数おかけしております!

    <?php
        $pages = get_pages('sort_column=post_date&child_of=12345&sort_order=ASC');
        foreach ( $pages as $page ) {
            $option = '<li><a href="' . get_page_link( $page->ID ) . '">';
            $option .= $page->post_title;
            $option .= '</a> ';
            $option .= get_post_meta($page->ID, 'カスタムフィールド名', true);
            $option .= ' ';
            $option .= mysql2date('Y.m.d', $page->post_date);
            $days=30;
            $today=date('U'); $entry=strtotime($page->post_date);
            $diff1=date('U',($today - $entry))/86400;
           if ($days > $diff1){
            echo'<font color="ff0000">New!</font>';
    }
            $option .= '</li>';
           echo $option;
        }
    ?>

    結論から申しますとNEW!が意図しない場所に出てきました。

    <ul>
    <li><a href="">タイトル</a> カスタムフィールド値 2013.06.19</li>
    <li><a href="">タイトル</a> カスタムフィールド値 2013.08.23</li>
    <li><a href="">タイトル</a> カスタムフィールド値 2014.05.30</li>
    <p><font color="ff0000">New!</font>
    <li><a href="">タイトル</a> カスタムフィールド値 2014.09.01</li>
    </ul>

    NEW!が出ている場所が微妙なので、出力結果として合っているのか自信がなく、しかし答えを導き出す方法も思いつきません。

    上記の子ページを作成したのは2013.6.19で、最初の孫ページを作成した日と同じです。
    (閉じられていないPタグも謎ですが、最終的にはimgでどうにかしたいです)

    出力結果として理想の形は最初にも書きました通り、

    ・リンク付きタイトル カスタムフィールド値 作成日 NEW!

    です。

    場所を変えたり色々やってみましたが、真っ白か同じ事象の繰り返しで行き詰まっています。
    このままget_pagesで試行錯誤して結果が得られそうなのか、get_pagesで理想の形にする事までは無理なのか?

    おかげ様で日付が出てきただけでも良しとするべきですが、あと少しのような気がしてあきらめきれません。
    何かご指南頂きたく再度投稿させて頂きました。ご覧の通り知識は初心者レベルです。

    お手すきの時で構いません、ヒントかずばり答えでも大歓迎です!ので、
    皆さまどうぞお知恵を貸してください。よろしくお願いします。

    $option.='<font color="ff0000">New!</font>';

    じゃ?

    トピック投稿者 ringoame

    (@ringoame)

    返信ありがとうございました!
    下記のように書いて理想通りの結果になりました。

    <ul>
    <?php
        $pages = get_pages('sort_column=post_date&child_of=12345&sort_order=ASC');
        foreach ( $pages as $page ) {
            $option = '<li><a href="' . get_page_link( $page->ID ) . '">';
            $option .= $page->post_title;
            $option .= '</a> ';
            $option .= get_post_meta($page->ID, 'カスタムフィールド名', true);
            $option .= ' ';
            $option .= mysql2date('Y.m.d', $page->post_date);
            $days=30;
            $today=date('U'); $entry=strtotime($page->post_date);
            $diff1=date('U',($today - $entry))/86400;
            if ($days > $diff1){$option.='<font color="ff0000">New!</font>';}
            $option .= '</li>';
            echo $option;
        }
    ?>
    </ul>

    色々試す間にコードがおかしな事になっていました。お恥ずかしいです。
    ご指南くださったjdbb様、Hinaloe様、本当にありがとうございました!

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「子ページに属する孫ページ一覧を作り新着マークを付けたい。」には新たに返信することはできません。