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

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

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

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

PHP

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

Q&A

1回答

1753閲覧

WordPressでfilter_inputを使ってPOSTを検証する例

sofa

総合スコア5

WordPress

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

PHP

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

0グッド

0クリップ

投稿2020/04/13 12:19

前提・実現したいこと

WordPressのAJAXで記事取得に必要な値をPOSTしています。

その値にfilter_inputを使いたいのですが経験がなく、その点ご指導願えませんでしょうか。

どうぞ宜しくお願い致します。

該当のソースコード

現在のコードはfilter_inputを使わず以下のようになっています。

php

1 2/* 3POSTされる値の内容 4 5access_url : アクセスされたURL 6process : 読み込み経路として 'a'|'b' を指定 7post_arg : 取得したい wp_posts の条件を指定 8*/ 9 10add_action( 'wp_ajax_get_posts_by_ajax', 'get_posts_by_ajax' ); 11function get_posts_by_ajax(){ 12 13 // 結果 14 $result = [ 'error'=>[], 'posts'=>[] ]; 15 16 // POSTを受け取る 17 $process = $_POST['process'] ? esc_html( $_POST['process'] ) : ''; 18 $access_url = $_POST['access_url'] ? esc_html( $_POST['access_url'] ) : ''; 19 $post_arg = $_POST['post_arg'] ? esc_html( $_POST['post_arg'] ) : ''; 20 21 // POSTを検証する 22 if ( preg_match( '/https?:/{2}[\w/:%#$&?()~.=+\-]+/', $access_url, $matches ) ) { 23 $result['error']['access_url'] = 'access_urlがおかしい'; 24 } 25 if ( $process !== 'a' && $process !== 'b' ) { 26 $result['error']['process'] = 'processがおかしい'; 27 } 28 if ( $post_arg === '' ) { 29 $result['error']['post_arg'] = 'post_argが空'; 30 } 31 32 // POSTに問題がなければ 33 if ( empty( $result['error'] ) ) { 34 35 // $process に応じて記事 $post_id を取得 36 if ( $process === 'a' ){ 37 $post_id = $post_arg['ID']; 38 } elseif ( $process === 'b' ){ 39 $slug = explode('/',$access_url)[5]; 40 $data = get_page_by_path($slug, OBJECT, 'post'); 41 $post_id = $data->ID; 42 } 43 44 // 記事の存在を検証してから取得 45 if ( ! get_post_status( $post_id ) ) { 46 $result['error']['ID'] = '記事がない'; 47 } else { 48 $result = get_posts( "includes=$post_id" ); 49 } 50 } 51 52 return $result; 53 die(); // ← WrodPerssのajaxは最後にdie()を書かないと0が返る 54}

上のコードではaccess_url、process、post_argという3つを検証しているわけですが、このうちaccess_url、processの2つはfilter_inputでできるものだと知りました。

###試したこと
そこで下記のようにしてみてはどうかと考えています。検証結果をerrorに入れてreturnさせるのではなく、dieですぐに終わらせるという流れです。

しかしfilter_inputの検証がどうもうまいことできません。

上のコードと同じようにaccess_url、processを検証するためにはどうしたらよろしいでしょうか。

そして、このようにdieですぐに終わらせるという流れはあっているのでしょうか?やはりfilter_inputを使ってもerrorに入れてreturnさせた方がいいでしょうか。

php

1 2add_action( 'wp_ajax_get_posts_by_ajax', 'get_posts_by_ajax' ); 3function get_posts_by_ajax(){ 4 5 // 結果 6 $result = [ 'error'=>[], 'posts'=>[] ]; 7 8 // POSTを受け取りつつ検証する 9 $process = filter_input('process', FILTER_VALIDATE_REGEXP, array('options'=>array('regexp'=>'/^[a|b]$/'))) ?? die('processがおかしい'); 10 $access_url = filter_input(INPUT_POST, 'access_url', FILTER_VALIDATE_URL) ?? die('access_urlがおかしい'); 11 $post_arg = $_POST['post_arg'] ? esc_html( $_POST['post_arg'] ) : ''; 12 13 // POSTを検証する 14 if ( $post_arg === '' ) { 15 $result['error']['post_arg'] = 'post_argが空'; 16 } 17 18 // POSTに問題がなければ 19 20 /* 21 あとは該当のソースコードと同じなので省略します 22 */ 23

補足情報(FW/ツールのバージョンなど)

WordPressは5.0.3を、そしてPHPは7.2を使用です。

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

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

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

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

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

guest

回答1

0

$process = filter_input('process', FILTER_VALIDATE_REGEXP, array('options'=>array('regexp'=>'/^[a|b]$/'))) ?? die('processがおかしい');

元のソースが$result['error']にエラーを溜め込んでいるのに、dieしちゃだめでしょ

投稿2020/04/13 12:52

yambejp

総合スコア116835

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

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

yambejp

2020/04/13 12:59

<?PHP $process=filter_input(INPUT_POST,'process',FILTER_VALIDATE_REGEXP,['options'=>['regexp'=>'/^[ab]$/']]); var_dump($process); ?> <form method="post"> <label><input type="radio" name="process" value="a">a</label> <label><input type="radio" name="process" value="b">b</label> <label><input type="radio" name="process" value="c">c</label> <input type="submit" value="send"> </form> 上記にて、$processがnullかfalseかそれ以外かで判別します
sofa

2020/04/13 14:22

>元のソースが$result['error']にエラーを溜め込んでいるのに、dieしちゃだめでしょ ご指摘ありがとうございます。やはりdieせずerrorに入れていくという方がよろしいでしょうか。dieすれば後の処理がなく、ダメな場合の判定が多少は早まるかと考えたのですが。
sofa

2020/04/13 14:23

>上記にて、$processがnullかfalseかそれ以外かで判別しま なるほど、私のfilter_inputにはINPUT_POSTが抜けていたのがいけなかったのですね。 そうしましたら先のerrorに入れていくことも踏まえまして、以下の流れがよさそうでしょうか。 fiter_inputを使いつつ、dieはせずerrorに入れるという流れになっています。 add_action( 'wp_ajax_get_posts_by_ajax', 'get_posts_by_ajax' ); function get_posts_by_ajax(){ // 結果 $result = [ 'error'=>[], 'posts'=>[] ]; // POSTを受け取る $process = filter_input(INPUT_POST, 'process', FILTER_VALIDATE_REGEXP,['options'=>['regexp'=>'/^[ab]$/']]); $access_url = filter_input(INPUT_POST, 'access_url', FILTER_VALIDATE_URL); $post_arg = $_POST['post_arg'] ? esc_html( $_POST['post_arg'] ) : ''; // POSTを検証する if ( ! $access_url ) ) { $result['error']['access_url'] = 'access_urlがおかしい'; } if ( ! $process ) { $result['error']['process'] = 'processがおかしい'; } if ( $post_arg === '' ) { $result['error']['post_arg'] = 'post_argが空'; } // POSTに問題がなければ /* あとは該当のソースコードと同じなので省略します */
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問