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

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

ただいまの
回答率

90.34%

  • PHP

    21337questions

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

  • WordPress

    7667questions

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

会員限定ページの一部を会員なしで見れるようにする

解決済

回答 2

投稿 編集

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

naonao11

score 60

wordpressで会員限定ページを作成しています。urlを打った時、ログイン画面に飛ぶようになっているのですが一部それに除外したページを作成したいのですがうまくいきません・・・

一部例外ページ: sample.php
Template name: sample

functions.php内に以下を書き込みました。

function require_login() {
    if (! is_page_template( 'sample.php' )) {
        if ( ! is_user_logged_in() &&
             ! preg_match( '/^(wp-login\.php|async-upload\.php)/', basename( $_SERVER['REQUEST_URI'] ) ) &&
             ! ( defined( 'DOING_AJAX' ) && DOING_AJAX )  &&
             ! ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
            auth_redirect();
        }
    }
}
add_action( 'init', 'require_login' );


ご助力のほうよろしくお願いします…

変更点を教えていただいてこのように書きました。

function require_login() {
    if ( ! is_user_logged_in() &&
     ! array_search( basename( $_SERVER['REQUEST_URI'] ), ['wp-login.php', 'async-upload.php'] ) &&
     ! ( defined( 'DOING_AJAX' ) && DOING_AJAX )  &&
     ! ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
              auth_redirect();
    }
}
add_action( 'init', 'require_login' );


この場合、リダイレクトを繰り返し以下のようなエラーが出ました。

Submitted URI too large!
The length of the requested URL exceeds the capacity limit for this server. The request cannot be processed.

If you think this is a server error, please contact the webmaster.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

if ( ! is_user_logged_in() && ! preg_match( '/^(wp-login\.php|async-upload\.php)/', basename( $_SERVER['REQUEST_URI'] ) ) && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX )  && ! ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {

を、慣れない正規表現なんて使わずに

if ( ! is_user_logged_in() && array_search( basename( $_SERVER['REQUEST_URI'] ), ['wp-login.php', 'async-upload.php'] ) !== FALSE && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX )  && ! ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {

とかしたらどうかな。
array_search()で、ヒットするべきファイル名の配列と比較するっていう。
ヒットしない時はFALSEを返すので、ほしい条件に合わせて !== とか === で適切に。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/28 13:56

    ありがとうございます!!
    つまり、ログインが必要ないページについてはarray_search内にそのファイル名を書くということでしょうか。。?

    キャンセル

  • 2018/06/28 13:57

    また教えていただいた方法を試すと
    Submitted URI too large! と出てきました…

    キャンセル

  • 2018/06/28 14:07

    質問文にある条件のみで回答できる範囲を回答しています。
    そもそもの目的にそぐわない可能性もあります。
    ファイル名のマッチングをミスしているとわかったので、その部分だけ指摘しています。

    エラーメッセージのみ報告されても、
    何をどう変えたのか把握できない以上、
    こちらでテストできるわけじゃないので、
    がんばってデバッグしてください。
    わからなければ、関係するコードすべて掲示するなり、
    質問内容を第三者にも分かるように改良してください。

    そのエラーメッセージの直接の意味は、
    GETリクエストがwebサーバープログラムが解釈できる長さよりも超えているときです。
    apacheであれば LimitRequestLine という設定値を大きくすれば改善できますが、
    そもそも正しい、処理可能なGETリクエストを送信しているか、
    webサーバーのアクセスログを点検するのが先です。

    キャンセル

  • 2018/06/28 14:15

    ありがとうございます、エラーが出たタイミングのところを記載させていただきましたのでご確認のほどよろしくお願いします。。。

    キャンセル

  • 2018/06/28 15:33 編集

    ア ク セ ス ロ グ を 点 検 す る の が 先 で す 。
    アクセスログには、GETリクエストが現れているので、正しいリクエストかどうか確認する最適な方法だと考えます。
    あと、リダイレクトを繰り返しているとのことですが、リダイレクトしてしまう条件は確認済みですか?

    キャンセル

check解決した方法

0

function require_login() {
    if (
        strstr( basename( $_SERVER['REQUEST_URI'] ),'sample') ||
        strstr( basename( $_SERVER['REQUEST_URI'] ),'example')) {
        }else{
            if (
                ! is_user_logged_in() &&
                ! preg_match( '/^(wp-login\.php|async-upload\.php)/', basename( $_SERVER['REQUEST_URI'])) &&
                ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) &&
                ! ( defined( 'DOING_CRON' ) && DOING_CRON )) {
                    auth_redirect();
                }
            }
        }
        add_action( 'init', 'require_login' );


URIに'sample'または'example'の値があった時自分が行いたい行動がとれていました。
お騒がせし申し訳ございません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    21337questions

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

  • WordPress

    7667questions

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