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

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

ただいまの
回答率

91.35%

  • PHP

    15214questions

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

  • WordPress

    4798questions

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

【Wordpress】公開状態「この投稿を先頭に固定表示」をカテゴリーで代用・再現したい

解決済

回答 1

投稿 2017/11/21 13:17

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

seiji_maemura

score 113

前提・実現したいこと

Wordpressには、公開状態「この投稿を先頭に固定表示」にチェックを入れると、記事を上部に固定できる機能があります。(sticky)
それをカテゴリで代用して「重要(important)」というカテゴリに所属している記事は、この機能と同じように先頭に固定表示し、且つ当年以外は表示しないという風にしたいと考えています。

■要望まとめ
・「重要(important)」と言うカテゴリに所属している場合、最初に表示(複数の場合投稿日時順でOK)
・次にそれ以外の投稿記事を表示(10件中2つ重要カテゴリなら、残り8件表示)

該当のソースコード

// 判定用にループ外で現在の日付’年’を取得しておく
$today = date("Y");

<?php
    echo '<table>';
    /*-----------------------------------------------------*/
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'posts_per_page' => 10,
    );
    $posts = get_posts($args);
    /*-----------------------------------------------------*/
    foreach ($posts as $key => $post) {
        // 変数処理
        $d         = strtotime($post->post_date);
        $alr_date  = date('Y/m/d', $d);
        $post_y    = date('Y', $d);
        $cat       = get_the_category();
        $cat_id    = $cat[0]->term_id;
        $cat_slug  = $cat[0]->slug;
        $cat_name  = $cat[0]->name;
        $alr_title = $post->post_title;
        $content   = $post->post_content;
        $post_link = get_the_permalink();
        $add_link  = get_field("external_link", $post->ID);

        if( !empty($add_link) ) {
            $alr_link = '<a href="'.$add_link.'" target="_blank">'.$alr_title.'</a>';
        }else{
            $alr_link = '<a href="'.$post_link.'" target="_self">'.$alr_title.'</a>';
        }
        // 固定する記事か判定し、今年投稿された記事かを判定
        if( $cat_slug == 'important' && $today == $post_y ) {
            echo <<< EOF

<tr class="clear">
    <th class="head">{$alr_date}</th>
    <td class="cat"><span class="cat-num cat-num-{$cat_id}">{$cat_name}</span></td>
    <td class="txt">{$alr_link}</td>
</tr>

EOF;
        }
        if( $cat_slug != 'important' ) {
            echo <<< EOF

<tr class="clear">
    <th class="head">{$alr_date}</th>
    <td class="cat"><span class="cat-num cat-num-{$cat_id}">{$cat_name}</span></td>
    <td class="txt">{$alr_link}</td>
</tr>

EOF;
        }
    }
    /*-----------------------------------------------------*/
    echo '</table>';
?>


「固定する記事か判定し、今年投稿された記事かを判定」と言うifで「重要(important)」カテゴリに所属する当年の記事を先に判定して、次にifでそれ以外とやっているのですが、重要カテゴリが先に表示されるわけでもなく通常通り記事が日付順に10件並んでしまうだけのようです。

なんとなく、条件にマッチしているから重要だろうとそれ以外であろうと、出力して特にソート指示もないので通常通りの並びになっているんだろうなとは思うのですが、施策の検討がつかず困っているので何か改変のアドバイスがあればよろしくお願いいたします。

公開状態「この投稿を先頭に固定表示」の機能補足

・複数の場合は、投稿日時でソートされて表示されるもようです。
・表示数は固定とされた記事が追加表示される模様です。(10件表示に固定4だと、14記事表示される)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

カテゴリID8「important」に限定したforeachを回して、重要カテゴリを先に抽出し、次に現在の”年”と投稿日の”年”を比較して今年の記事のみを選出。

次いで該当カテゴリ以外の記事を並べる為にもう一度foreachを回すようにして、記事を出すようにしました。

最終的なソースは以下です。

<?php
    echo '<table>';
    /*-----------------------------------------------------*/
    // カテゴリID8「important」の記事抽出
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'cat'            => 8,
        'posts_per_page' => -1,
    );
    $posts = get_posts($args);
    /*-----------------------------------------------------*/
    foreach ($posts as $key => $post) {
        $d         = strtotime($post->post_date);
        $alr_date  = date('Y/m/d', $d);
        $post_y    = date('Y', $d);
        $cat       = get_the_category();
        $cat_id    = $cat[0]->term_id;
        $cat_slug  = $cat[0]->slug;
        $cat_name  = $cat[0]->name;
        $alr_title = $post->post_title;
        $post_link = get_the_permalink();
        $add_link  = get_field("external_link", $post->ID);

        if( !empty($add_link) ) {
            $alr_link = '<a href="'.$add_link.'" target="_blank">'.$alr_title.'</a>';
        }else{
            $alr_link = '<a href="'.$post_link.'" target="_self">'.$alr_title.'</a>';
        }
        // 当年の記事のみを選出
        if( $today == $post_y ) {
            echo <<< EOF

<tr class="clear">
    <th class="head">{$alr_date}</th>
    <td class="cat"><span class="cat-num cat-num-{$cat_id}">{$cat_name}</span></td>
    <td class="txt">{$alr_link}</td>
</tr>

EOF;
        }
    }
    /*-----------------------------------------------------*/
    // カテゴリID8「important」以外の記事抽出
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'cat'            => -8,
        'posts_per_page' => 5,
    );
    $posts = get_posts($args);
    /*-----------------------------------------------------*/
    foreach ($posts as $key => $post) {
        $d         = strtotime($post->post_date);
        $alr_date  = date('Y/m/d', $d);
        $cat       = get_the_category();
        $cat_id    = $cat[0]->term_id;
        $cat_slug  = $cat[0]->slug;
        $cat_name  = $cat[0]->name;
        $alr_title = $post->post_title;
        $post_link = get_the_permalink();
        $add_link  = get_field("external_link", $post->ID);

        if( !empty($add_link) ) {
            $alr_link = '<a href="'.$add_link.'" target="_blank">'.$alr_title.'</a>';
        }else{
            $alr_link = '<a href="'.$post_link.'" target="_self">'.$alr_title.'</a>';
        }
        echo <<< EOF

<tr class="clear">
    <th class="head">{$alr_date}</th>
    <td class="cat"><span class="cat-num cat-num-{$cat_id}">{$cat_name}</span></td>
    <td class="txt">{$alr_link}</td>
</tr>

EOF;
    }
    /*-----------------------------------------------------*/
    echo '</table>';
?>


非常に泥臭いやり方かと思いますが、自己解決しました。
失礼しました。

投稿 2017/11/21 14:39

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.35%

関連した質問

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

  • PHP

    15214questions

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

  • WordPress

    4798questions

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