ページの先頭へ

【WordPressのpost_linkで非公開ページが出てこない問題】ついにできた。

C-Notes.

【WordPressのpost_linkで非公開ページが出てこない問題】ついにできた。

2015.02.18 (Wed) 0

こんにちは。ついに……!ずっと悩んでいた問題が解決できました。

Worksの個別記事を少し変えたのですが、

ログインした際に個別記事ページから次の作品、前の作品を見ようとすると、非公開ページを読んでくれず少しおかしなことになっていたのです。

どうやったの?

具体的にはこちらのページが大変参考になりました。ありがとうございます。

もとの関数をいじります。私の加えた分を考慮するとおそらくだいぶアラワザです。

WordPressさっぱりだという方 (そもそもこの問題に当たらないと思いますが、、)や、WordPress今後アップデートしていきたいという方はお控え下さい。

2020/5 追記: この記事を書いていたときから知識が増えたのですが、セキュリティ面を考慮すると、WordPressは基本的にアップデートしたほうがいい & wp_includesの中身はアップデート時に変わるので、いじらずそっとしておいたほうがいいです。
自己責任でお願いいたします。

まずは、wp_includesフォルダの中のlink_template.phpをいじります

ここがけっこう大変なので検索・置き換えを使ってうまくやって下さい。

  • get_previous_post()
  • prev_post_rel_link()
  • get_previous_post_link()
  • previous_post_link()

get_next_postなど、previous・prevがnextに置き換わっているところも同様にやってください。

つまり8箇所、

function get_previous_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
return get_adjacent_post( $in_same_term, $excluded_terms, true, $taxonomy);
}

function get_previous_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category', $status_all = false ) {
return get_adjacent_post( $in_same_term, $excluded_terms, true, $taxonomy, $status_all);
}

こういう感じにして下さい。かっこの中の最後をつけたしてあげるのです。

 

次に、get_adjacent_post()

function get_adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms ='', $previous = true, $taxonomy = 'category' ) {

function get_adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms ='', $previous = true, $taxonomy = 'category', $status_all = false ) {

とします。そしておそらく1520行あたりにあるんですが、

$adjacent = $previous ? 'previous' : 'next';
$op = $previous ? '<' : '>';
$order = $previous ? 'DESC' : 'ASC';
$status = ( $status_all ) ? " IN ('publish', 'private')" : " = 'publish'";

こんなかんじのところにこんなかんじになるように最後の1行を追加します。

 

以上の手順で、$statusという指示書に、$status_allがtrueのときは「publish(公開)の状態とprivate(非公開)の状態の記事を読んでこい」と記します。

一方falseのときは、「publishの記事だけ読んでこい」と記します。

 

参照元のサイトさんでは下書きと承認待ちも読むようになっていたんですが、今回の場合必要ないので消しました。

 

で、そのちょっとあとにある

$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $where", $current_post_date, $post->post_type ), $in_same_term, $excluded_terms );

これを

$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status".$status." $where", $current_post_date, $post->post_type ), $in_same_term, $excluded_terms );

こうします。ようするに p.post_status=’publish’ っていうのを “p.post_status”.$status.” にしてあげます。

 

こうすることで、
読む記事は?→ publish(公開)の記事!、、であったところを、
読む記事は?→ $statusの指示書を読んで!というふうにするのです。

この説明、我ながらとってもわかりやすい。笑

あとは組み込むだけ

私は「ログイン時だけ非公開を読む」というふうにしてほしかったので、テンプレートのphpファイルにこう書きました。

<!--?php if ( is_user_logged_in() ) : //ログインしてるときだけ
  next_post_link('%link', '<img class="arrowL" src="' .get_stylesheet_directory_uri(). '/images/works_arrowl.png" alt="前へ" width="64" height="33" /-->', true, '', 'category', true);  //$status_allをtrueにして非公開を読ませる
  previous_post_link('%link', '<img class="arrowR" src="' .get_stylesheet_directory_uri(). '/images/works_arrowr.png" alt="次へ" width="64" height="33" />', true, '', 'category', true); //previousも同様
  ; else : //ログインしてなかったら
  next_post_link('%link', '<img class="arrowL" src="' .get_stylesheet_directory_uri(). '/images/works_arrowl.png" alt="前へ" width="64" height="33" />', true); //指定なし、falseのまんま
  previous_post_link('%link', '<img class="arrowR" src="' .get_stylesheet_directory_uri(). '/images/works_arrowr.png" alt="次へ" width="64" height="33" />', true); //previousも同様
endif ?>

ということで、完成です。

日本語でググっても英語でググってもなかなか出てこなかった情報を、一足先に提供できた喜びを感じています。笑

海外で困っている人の質問は出てくるんですけどね。こことか。

しかしはじめにリンク張らせていただいた記事に出会えなかったら解決できなかったかもしれない。

これが歴史の積み重ねというものですね。。違う?

もっとスマートな方法あったら教えてくださいー。

0

Comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です