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

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

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

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

PHP

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

Q&A

解決済

2回答

6461閲覧

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

bpbjsu

総合スコア24

WordPress

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

PHP

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

2グッド

0クリップ

投稿2016/04/29 01:19

編集2016/05/02 11:42

###実現したいこと

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(); ?>
KazuakiHarigaya, ikuwow👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

真偽値である必要は無いと思います。
カスタムフィールドに任意のキーと値(キーは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という形式で表示させたい時は次のようにして下さい。

PHP

1// 日付のフィールドを取得 2$field_date = get_field( 'fi_day' ); 3// 日付の形式を変換 4if ( !empty($field_date) ) { 5 $view_date = date( 'Y/m/d', strtotime( $field_date ) ); 6} else { 7 // 日付のフィールドが取得出来なかった時の表示 8 $view_date = 'date not found.'; 9} 10// 表示 11echo $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)に限った話ではないですが「取得する情報の内容」を確認する癖を付けておくと良いです。

PHP

1// ACFのデイトピッカーで設定したカスタムフィールドの日付を取得 yymmdd 2$field_date = get_field( 'fi_day' ); 3 4// 書式化したローカルの日付を取得 Ymd 5$local_date = date( 'Ymd' ); 6 7// WordPressで設定した日付のフォーマットで投稿の日付を取得 8$wp_date = get_the_date(); 9 10// 指定したフォーマットで投稿の日付を取得 Ymd 11$wp_date_new = get_the_date( 'Ymd' ); 12 13echo '<pre>'; 14var_dump( $field_date ); 15var_dump( $local_date ); 16var_dump( $wp_date ); 17var_dump( $wp_date_new ); 18echo '</pre>';

投稿2016/04/29 09:35

編集2016/05/03 12:51
flat

総合スコア617

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bpbjsu

2016/05/02 10:43 編集

ご回答ありがとうございます。 【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としないと表示されない。
flat

2016/05/02 14:52

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

2016/05/03 16:55

日付のわかりやすい解説ありがとうございます。 archive-event.phpとしてページを作成したら実現させることができました。 ありがとうございました。
guest

0

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

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

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

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

投稿2016/04/30 13:43

編集2016/05/02 11:52
kei344

総合スコア69366

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bpbjsu

2016/05/02 10:47

ご回答ありがとうございます。 flatさんへの返信と同じになってしまいますが、一部解決致しました。 「stickyポスト」というキーワードが解決のヒントになりました。 【1】 「カスタム投稿タイプのアーカイブ」についてよく理解出来ておらず要領がわかりません。 参考になるリンクなど教えて頂けませんでしょうか? 【2】 カスタムフィールドでの運用があまり理解出来ていないため実装ができませんでしたが、プラグインを使うことで解決しました。 [試行・解決] 1. カスタム投稿に「先頭に固定表示」を追加できるプラグイン「Seamless Sticky Custom Post Types」をインストール。 2. その上で、 $param = array( 内に 'post__in' => get_option( 'sticky_posts' ), を追加。 3. トップに表示させたい記事の「先頭に固定表示」に✔️を入れると無事、選択した記事をトップページに表示させることができました。
kei344

2016/05/02 11:04

カスタム投稿タイプのアーカイブについては、どう実装しているかによります。ツールを使っているのか functions.php に書いているのかで変わりますし、どちらにせよ情報が足りません。そのあたりの情報を質問文に追記していただければ。
bpbjsu

2016/05/02 11:44

概要を追記致しました。
kei344

2016/05/02 11:53

追記しました。
bpbjsu

2016/05/03 17:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問