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

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

ただいまの
回答率

90.35%

  • PHP

    25493questions

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

  • WordPress

    9586questions

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

WordPressで、選択した記事(イベント)だけトップに表示させたい/終了したイベントは非表示にしたい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,929

izumigt

score 19

実現したいこと

WP Query関数を使い、カスタム投稿タイプのイベント情報一覧を表示しているのですが、以下を実現したいです。

【1】イベント一覧ページでは全ての情報を表示
【2】トップページでは選択した記事のみを表示

真偽値を使って、カスタムフィールドで、✔️をはずすとトップページ非表示などできないものでしょうか?

【3】また、終了したイベントは一覧から非表示(単独の記事は残す)

以下のようにしたのですが、本日以前も表示されてしまいます。

//トップページ
<?php
    $wp_query = new WP_Query();
    $param = array(
        'posts_per_page' => '24',
        'post_type' => 'event',
        'post_status' => 'publish',
        'meta_key'=>'fi_day', //日付が入るカスタムフィールド名
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'meta_compare' => '>=',
        'meta_value'=> date("yy/mm/dd"),
        'meta_type' => 'DATE'
    );
    $wp_query->query($param);
    if($wp_query->have_posts()): while($wp_query->have_posts()) : $wp_query->the_post();
?>

ループ内容

<?php
    endwhile;
  endif;
?>
<?php wp_reset_postdata(); ?>

お知恵をお貸し下さい。宜しくお願いいたします。

※WP Query関数では実現出来ず、get_posts関数の方で実現できるのであれば教えていただきたいです。

※カスタム投稿タイプの作成は「Custom Post Type UI」
カスタムフィールドの作成は「Advanced Custom Fields」を使用しています。

追記(一部解決)

【2】は「Seamless Sticky Custom Post Types」プラグインで解決。
【3】については若干疑問点が残りましたが解決しました(詳しくは解答欄)。

【1】について
「カスタム投稿タイプのアーカイブ」で解決とのことですが、現状での実装方法がわかりません。

プラグイン「Event organiser」を使い、上部に特定カテゴリのみのカレンダーを表示しています。
下部にそのカテゴリーに含まれる記事一覧を表示させたいです。

functions.phpでの処理はしておらず、プラグインで用意されているカテゴリー(おそらくタクソノミー名はevent-category)と、そこで作成したカテゴリ(night)を使用。

カテゴリ別のカレンダーのショートコードを使うため固定ページのテンプレートとしています。

方法1だと記事一覧が何も表示されなくなります。
方法2だと全てのイベントが表示されてしまいます。

//カテゴリ[night]のイベントのみを表示させる

<?php
/*
Template Name: Schedule-night
*/
?>

//〜headerの読み込みなど

<?php
  if (have_posts()) :
    while (have_posts()) :
      the_post();
?>
<?php the_content(); ?> //カテゴリー night のみを表示させるカレンダーを固定ページのテキストエリアにショートコードで記述。
<?php
    endwhile;
  endif;
?>
<?php wp_reset_query(); ?> 

<?php
    $wp_query = new WP_Query();
    $param = array(
        'tax_query' => array(
            'taxonomy' => 'event-category',
            'field'    => 'slug',
            'terms'    => 'night'
        ),//方法1
        'category_name' => 'night',//方法2
        'posts_per_page' => '30',
        'post_type' => 'event',
        'post_status' => 'publish',
        'meta_key'=>'fi_day',//日付が入るカスタムフィールド名
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'meta_compare' => '>=',
        'meta_value'=> date("Y-m-dd"),
        'meta_type' => 'DATE'
    );
    $wp_query->query($param);
    if($wp_query->have_posts()): while($wp_query->have_posts()) : $wp_query->the_post();
?>
//ループさせる内容
<?php
    endwhile;
  endif;
?>
<?php wp_reset_postdata(); ?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+5

-イベント一覧ページでは全ての情報を表示 

カスタムフィールドでの絞り込みなどを行わずにカスタム投稿タイプのアーカイブとして表示させることですべての投稿が取得できます。

-トップページでは選択した記事のみを表示
真偽値を使って、カスタムフィールドで、✔️をはずすとトップページ非表示などできないものでしょうか? 

真偽値である必要は無いと思います。
カスタムフィールドに任意のキーと値(キーはdisplay、値はonなど)を与えて、その値を含む投稿を表示するというやり方で良いと思います。
あとは入力するカスタムフィールドの項目をチェックボックスにしておけば切り替えは容易に行えるはずです。

以下のようにしたのですが、本日以前も表示されてしまいます。 

date("yy/mm/dd")という箇所をdate("y/m/d")などのmeta_valueと同じ適切な形式に修正してください。
現状では、例えば本日2016年4月29日の日付をdate("yy/mm/dd")で取得すると1616/0404/2929となってしまいます。


追記(一部訂正)

ACFで指定する日付とdate_queryで指定する日付を混同しています。(私も混同しました)
date()による書式化した日付の指定の仕方とACFの設定する日付の指定の仕方はフォーマットが異なります。
ACFで設定する「フォーマットを保存する」という項目ではデフォルトのyymmddとし、「表示フォーマット」という項目では日付を認識しやすいようにyy/mm/ddとしてください。
これはそのままechoなどで出力すると20160502のような日付の形式になるので2016/05/02という形式で表示させたい時は次のようにして下さい。

// 日付のフィールドを取得
$field_date = get_field( 'fi_day' );
// 日付の形式を変換
if ( !empty($field_date) ) {
  $view_date = date( 'Y/m/d', strtotime( $field_date ) );
} else {
  // 日付のフィールドが取得出来なかった時の表示
  $view_date = 'date not found.';
}
// 表示
echo $view_date;


また、これに合わせてmeta_valueで指定していた日付は'meta_value' => date( 'Ymd' )として下さい。
カスタムタクソノミーについてはtax_queryを利用した方が柔軟に対応できると思います。
なお、tax_queryに渡すカスタムタクソノミーは正確に指定しなければ有効にならないので、よく確認して指定して下さい。

そしてカスタム投稿タイプのアーカイブについてですが、これはカスタム投稿タイプでhas_archiveというパラメータがtrueになっていれば、特に何もしなくとも、そのカスタム投稿タイプのアーカイブのURL(domain.com/event/など)にアクセスすることでそのまま通常のループ中にすべて表示されます。
カスタムタクソノミーはプラグインが用意したものということなので、アーカイブページにアクセス出来なければおそらくhas_archiveが有効になっていません。
また、アーカイブページへのアクセスを確認するときは、念の為にパーマリンク設定を更新してからアクセスしてください。
独自のテンプレートにしたい場合はファイル名をarchive-event.phpとして作成して下さい。
こちらも投稿の一覧を表示させるループは通常の書き方で大丈夫です。


補足

WordPress(PHP)に限った話ではないですが「取得する情報の内容」を確認する癖を付けておくと良いです。

// ACFのデイトピッカーで設定したカスタムフィールドの日付を取得 yymmdd
$field_date = get_field( 'fi_day' );

// 書式化したローカルの日付を取得 Ymd
$local_date = date( 'Ymd' );

// WordPressで設定した日付のフォーマットで投稿の日付を取得
$wp_date = get_the_date();

// 指定したフォーマットで投稿の日付を取得 Ymd
$wp_date_new = get_the_date( 'Ymd' );

echo '<pre>';
var_dump( $field_date );
var_dump( $local_date );
var_dump( $wp_date );
var_dump( $wp_date_new );
echo '</pre>';

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/02 19:42 編集

    ご回答ありがとうございます。

    【1】
    「カスタム投稿タイプのアーカイブ」についてよく理解出来ておらず要領がわかりません。
    参考になるリンクなど教えて頂けませんでしょうか?

    【2】
    カスタムフィールドでの運用があまり理解出来ていないため実装ができませんでしたが、プラグインを使うことで解決しました。

    [試行・解決]
    1. カスタム投稿に「先頭に固定表示」を追加できるプラグイン「Seamless Sticky Custom Post Types」をインストール。
    2. その上で、 $param = array( 内に 'post__in' => get_option( 'sticky_posts' ), を追加。
    3. トップに表示させたい記事の「先頭に固定表示」に✔️を入れると無事、選択した記事をトップページに表示させることができました。

    【3】
    終了したイベント(本日以前のイベント)を非表示にすることができましたが、いくつか疑問点が生まれました。

    [前提]
    date("yy/mm/dd") という表記にした理由は、
    プラグイン「Advanced Custom Fields」のデイトピッカーの初期設定がyymmddだったのでそれに習い、/ を加えた形にしました。

    [試行]
    flatさんのアドバイス通り全ての日付設定を、y/m/d に変更してみました。
    →変化がありませんでした。

    [改善・解決]
    そこで、WPの設定「日付のフォーマット」が影響していると思い、デフォルトの選択肢にある Y-m-d に切り替えることで解決しました。

    [課題・疑問]
    ですがこの問題での未解決な部分があります。
    以下の設定で無事、本日以降のイベント情報を表示させることができたのですが、この設定以外では、本日以前も表示されたり、何も表示されなかったりしてしまいます。

    全ての表示がバラバラなのは何故なのでしょうか?

    ■現状
    ・WPの日付のフォーマット
    Y-m-d
    →単にカスタムより、用意されているものを利用したほうが安牌かなと思ったのでこれを選択しました。

    ・ACFの日付のフォーマット(表示させる形式)
    yy/mm/dd
    →Yだと、そのままYという文字で出力されてしまう。

    ・ループの設定
    'meta_value'=> date(‘Y-m-dd')
    →dではなくddとしないと表示されない。

    キャンセル

  • 2016/05/02 23:52

    追記しましたのでご確認下さい。

    キャンセル

  • 2016/05/04 01:55

    日付のわかりやすい解説ありがとうございます。

    archive-event.phpとしてページを作成したら実現させることができました。
    ありがとうございました。

    キャンセル

+3

イベント一覧ページでは全ての情報を表示

flatさんの回答にあるように「カスタム投稿タイプのアーカイブ」が良いと思います。

トップページでは選択した記事のみを表示 

標準の機能で可能だと思います。もし「先頭に固定表示」で実装される場合は、表示の際にちょっと癖があるので、下記サイトを参考にすることをお勧めします。

【先頭固定表示の投稿 - WordPress Codex 日本語版】
https://wpdocs.osdn.jp/先頭固定表示の投稿

【WordPressで「先頭に固定表示」をWP_Queryでも活かす : kosukekato.com : the idea espresso】
http://www.ex-tra.jp/kosukekato/archives/5353

【WordPressの "sticky"ポストについて - Daily GLOCALISM】
http://daily.glocalism.jp/memo/wordpressのstickyポストについて/


追記:

WP_Query を使わないでもトップページ用テンプレートで下記のようにすれば「今から」のイベントは取得できるのでは?

<?php echo do_shortcode('[eo_events event_start_after=”now”]'); ?>

【Event Organiser ワードプレスでイベントサイトを作れるプラグイン | webooooo SEO対策 大阪 WEBコンサルティング 】
http://webooooo.com/event-organiser-339.html

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/02 20:44

    概要を追記致しました。

    キャンセル

  • 2016/05/02 20:53

    追記しました。

    キャンセル

  • 2016/05/04 02:21

    今回は、archive-event.phpを使用して作成することにしました。
    誠にありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • PHP

    25493questions

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

  • WordPress

    9586questions

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

  • トップ
  • PHPに関する質問
  • WordPressで、選択した記事(イベント)だけトップに表示させたい/終了したイベントは非表示にしたい。