web-dev-qa-db-ja.com

プラグイン内のURLの検証機能

    if ( cpmb_is_valid_mp3( $_FILES['video-url']['name'] ) ) {

            $response = wp_upload_bits( $_FILES['video-url']['name'], null, file_get_contents( $_FILES['video-url']['tmp_name'] ) );

            if ( 0 == strlen ( trim( $response['error'] ) ) ) {
                update_post_meta( $post_id, 'mp3', $response['url'] );
            }

        // Otherwise, mark this as an invalid file
        } else {
            update_post_meta( $post_id, 'mp3', 'invalid-file-type' );
        }

上記はプラグインのコードの一部です。それからここに来る関数

function cpmb_is_valid_mp3( $filename ) {

    $path_parts = pathinfo( $filename );
    return 'mp3' == strtolower( $path_parts['extension'] );

}

私が理解していること:ファイルが.mp3であることが確認されたら、コードを実行してください。 ?

QUESTION:誰かが私を手助けして「URL」の検証を作成させることができますか?

私はこうやってみました→

if ( cpmb_is_valid_url( $_REQUEST['video-url']['name'] ) ) {

   Some code is executed here.

}

しかし、私はこの関数を書く方法がわからない→

cpmb_is_valid_url
1
The WP Novice

PHPの parse_url() および/または filter_var()をFILTER_VALIDATE_URLフィルターで調べますparse_url()を使用すると、もう少し制御できます。最後に述べたように、それを消毒と組み合わせてください。

いくつかのユースケースを以下に示します。これらのケースは、処理の進め方に関するより良いアイデアを提供してくれることを願っています。


URLのドメインが承認済みサイトのものであることを確認したい場合:

function url_allowed( $url ) {

        $allowed_hosts = array(
                        'youtube.com',
                        'vimeo.com'
                        ); 
        if ( in_array( parse_url( $url, PHP_URL_Host ), $allowed_hosts ) ) {
            return true;
        }

        return false;      
    }

次に、URLを渡して、条件内で確認します。

if ( url_allowed( $value_of_url_to_check_wherever_you_are_getting_it ) ) {
    //do stuff
}

単にURLであることを確認したい場合(これにはftp://など、btwが含まれます)、

if ( filter_var( $url, FILTER_VALIDATE_URL ) ) {
    //do stuff
}

httpまたはhttpsで始まるURLのみを許可する場合、

if ( parse_url( $url, PHP_URL_SCHEME ) == 'http' || parse_url( $url, PHP_URL_SCHEME ) == 'https' ) {
    //do stuff
}

WordPress esc_url() またはphp filter_var( $url, FILTER_SANITIZE_URL ) を使用してURLをサニタイズすることもお勧めします


編集:WPのwp_parse_url()を使用する

WordPressは、PHPのparse_url()wp_parse_url() のラッパーを提供します。 'scheme''Host'、および'path'の配列を返します。使用法は上記と同じです。

function url_allowed( $url ) {

        $allowed_hosts = array(
                        'youtube.com',
                        'vimeo.com'
                        );
        $url_array = wp_parse_url($url); 
        if ( in_array( $url_array['Host'], $allowed_hosts ) ) {
            return true;
        }

        return false;      
    }

さらに、WordPress関数 wp_allowed_protocols() は、チェック可能なプロトコルのデフォルトリストを返します。

  array( 'http', 
         'https', 
         'ftp', 
         'ftps', 
         'mailto', 
         'news', 
         'irc', 
         'Gopher', 
         'nntp', 
         'feed', 
         'telnet', 
         'mms', 
         'rtsp', 
         'svn', 
         'tel', 
         'fax', 
         'xmpp', 
         'webcal', 
         'urn' 
    )

このリストは、フック kses_allowed_protocols でフィルタリングできます。たとえば、mailtoプロトコルを削除すると、次のようになります。

add_filter( 'kses_allowed_protocols', 'my_protocols' );
function my_protocols( $protocols ) {

    if( ($key = array_search( 'mailto', $protocols ) ) !== false ) {    
        unset( $protocols[ $key ] );
    }
}

この承認済みプロトコルリストは、 _links_add_base()edit_user() (ユーザーURLフィールド用)、 wp_kses()wp_kses_one_attr() 、および esc_url()

この配列に対して単にチェックするのではなく、入力フィールドの目的のプロトコルを明示的にチェックする方が良いと考えます。


より完全な使用例

ユーザーは特定のサイトからURLを入力できるようにするため、どちらの場合もこれらのビデオURLはプロトコルhttpsを使用して提供されるため、サイトHostを確認してプロトコルを強制し、esc_url()を使用して文字をクリーンアップします。

最終結果では、URLがVimeoとYouTubeのどちらであるかを知る必要があるため、それも保存できます。

使用される許可されたホストに対してチェックし、url_verify()

function url_allowed_Host( $Host ) {

    $allowed_hosts = array(
                    'youtube.com',
                    'vimeo.com'
                    );

    if ( in_array( $Host, $allowed_hosts ) ) {
        return true;
    }

    return false;      
}

入力されたURLを解析し、httpsを強制し、許可されたホストを確認し、値の配列を作成して返します

   function url_verify( $url ) {

        $url_array = wp_parse_url( $url );

        if ( $url_array['scheme'] !== 'https' ) {

            $url_array['scheme'] = 'https';
        }

        if ( url_allowed_Host( $url_array['Host'] ) ) {

            //lets ditch the .com
            $Host_Word = explode( '.', $url_array['Host'] );

            //this should now be just "youtube" or "vimeo"
            $meta_array['Host'] = $Host_Word;
            $meta_array['url']  = $url_array['scheme'] . $url_array['Host'] . $url_array['path'];

            return $meta_array;

       } else {

        return false;

       }

   } 

urlおよびurlホスト名で配列を保存します

  add_action( 'save_post', 'my_meta_save', 10, 2 );

  function my_meta_save( $post_id, $post ) {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
            return;
        }
    //do nonce check here

    //assuming form field is named: video-url, make sure it is set and not empty AND that url_verify did not return false
    if ( ( isset( $_POST['video-url'] ) && ! empty( $_POST['video-url'] ) ) && ( false !== url_verify( $_POST['video-url'] ) ) ) {


        update_post_meta( $post_id, 'video_url', esc_url( $POST['video_url'] ) );

    }
    //if any of the above are not true, treat it as blank and delete existing value
    else {

        delete_post_meta( $post_id, 'video-url' );
    }    


  }

値を取得する

$video_meta = get_post_meta( $post_id, 'video-url', false );
$url = esc_url( $video_meta['url'] );
$Host = santize_text_field( $video_meta['Host'] );

ホストごとに条件付きで何かを表示する

許可されたドメインのリストが長い場合に備えて、ここでスイッチを使用します。

switch ( $Host ) {
    case "youtube":
        //do some youtube stuff
        break;

    case "vimeo":
        //do some vimeo stuff
        break;
}
3
hwl