前提・実現したいこと
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を使用です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/13 12:59
2020/04/13 14:22
2020/04/13 14:23