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

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

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

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

PHP

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

Q&A

2回答

1930閲覧

Wordpressの前次リンクから、特定のカスタムフィールドの値のものを除外したい

gobo_k

総合スコア10

WordPress

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

PHP

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

0グッド

1クリップ

投稿2019/01/29 09:35

やりたいこと

公開/非公開ではなく、公開したまま記事の表示/非表示を切り替えたい。
(すみませんが、そうしたい理由はわからないのです)

メインループ・サブループから除外は出来たのだが、前次リンクに非表示のはずのページが出てきてしまうので除外したい。

困っていること

カテゴリやタクソノミーでの一括除外は出来るが、カスタムフィールドの値による制御は出来ないような気がしてきた。

書いたコード

__room__の記事ページのメインループはpre_get_postsでカスタムフィールド__room_flag__を除外するようになっている。

function.php

wordpress

1add_action( 'pre_get_posts', 'pre_get_posts'); 2function pre_get_posts($query) { 3 if ( is_admin() || ! $query->is_main_query() ){ 4 return; 5 } 6 if(is_singular('room')) { 7 $query->set( 'meta_query', 8 array( 9 'key' => 'room_flag', 10 'value' => true, 11 'compare'=>'!=' 12 ) 13 ); 14 } 15}

single-room.phpに、ごく普通のprevious_postを書いて、カスタマイズしようと思ってつまずいた。
previous_postには全くこだわっていないので、出来るものならどういう方法でも構わない。

wordpress

1<ul class="nav-prevnext"> 2<?php if( get_previous_post() ): ?> 3<li class="nav-prev"><?php $prev = get_previous_post(); ?> 4<a href="<?php echo get_permalink($prev->ID) ?>"> 5<span>前の記事へ</span> 6<?php echo $prev->seminar_title; 7?></a></li> 8<?php endif; ?> 9<?php if( get_next_post() ): ?> 10<li class="nav-next"><?php $next = get_next_post(); ?> 11<a href="<?php echo get_permalink($next->ID) ?>"> 12<span>次の記事へ</span> 13<?php echo $next->seminar_title; 14?></a></li> 15<?php endif; ?> 16</ul>

知りたいこと

  1. そもそもそんなことは実現可能なのか
  2. previous_postで出来るのか
  3. previous_postじゃないとしたら何を使うのが良いのか

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

既に回答に出ていますが、get_adjacent_post関数のフィルターフックを利用することで、「特定のカスタムフィールドが設定されている投稿get_previous_post関数から除外する」ことができます。

以下は、get_next_post関数の例です。

PHP

1add_filter( 'get_next_post_join', 'teratail171568_gobo_k_1', 10, 5 ); 2add_filter( 'get_next_post_where', 'teratail171568_gobo_k_2', 10, 5 ); 3 4function teratail171568_gobo_k_1( $join, $in_same_term, $excluded_terms, $taxonomy, $post ) { 5 global $wpdb; 6 7 $join .= "LEFT JOIN $wpdb->postmeta as m ON ( p.ID = m.post_id )"; 8  9 var_dump($join); 10 return $join; 11} 12function teratail171568_gobo_k_2( $where, $in_same_term, $excluded_terms, $taxonomy, $post ) { 13  global $wpdb; 14 15 $where .= <<< EOF 16AND NOT ((m.meta_key LIKE 'room\_flag') AND (m.meta_value LIKE 'true')) 17AND p.ID != (SELECT m2.post_id FROM {$wpdb->postmeta} AS m2 WHERE (m2.meta_key LIKE 'room\_flag') AND (m2.meta_value LIKE 'true')) 18EOF; 19 20 var_dump($where); 21 return $where; 22}

投稿2019/01/31 07:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

gobo_k

2019/02/01 01:42

ありがとうございます。 SQL文は避けて通れないようなのでがんばります。
guest

0

previous_postは内部的にget_adjacent_postを呼んでいるので、そこで組まれているSQLをフックで処理すれば多分出来ます。(2つめのリンク先が近い部分だと思います)

【get_adjacent_post() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/get_adjacent_post/

【custom post types - Filter next_post_link() and previous_post_link() by meta_key? - WordPress Development Stack Exchange】
https://wordpress.stackexchange.com/questions/139453/filter-next-post-link-and-previous-post-link-by-meta-key

投稿2019/01/29 16:21

kei344

総合スコア69400

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

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

gobo_k

2019/01/31 01:48

ありがとうございます。 SQL文を勉強しつつ試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問