插件中URL的验证函数

时间:2017-07-29 作者:The WP Intermediate

    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\' );
        }
以上是plugin. 然后来了function

function cpmb_is_valid_mp3( $filename ) {

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

}
让我告诉你我understand:如果经过验证,则该文件.mp3 然后执行代码?

QUESTION: 有人能帮我为“URL”创建这样的验证吗?

我试过这样→

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

   Some code is executed here.

}
但是我不知道怎么写这个函数→

cpmb_is_valid_url

1 个回复
最合适的回答,由SO网友:hwl 整理而成

我会调查PHP的parse_url() 和/或filter_var() with FILTER_VALIDATE_URL filter. parse_url() 给你更多的控制。结合最后提到的消毒。

以下是一些用例,希望能让您更好地了解如何继续:

<小时>

If you want to verify that the url\'s domain is of an approved site:

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
}
<小时>If you just want to confirm it is a url at all (其中包括ftp://, 等等,顺便说一句),

if ( filter_var( $url, FILTER_VALIDATE_URL ) ) {
    //do stuff
}
<小时>If you would like to only allow urls beginning with http or https,

if ( parse_url( $url, PHP_URL_SCHEME ) == \'http\' || parse_url( $url, PHP_URL_SCHEME ) == \'https\' ) {
    //do stuff
}
我还建议通过WordPress清理urlesc_url() 或php的filter_var( $url, FILTER_SANITIZE_URL )

编辑:使用WPwp_parse_url()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。

check against allowed hosts, used by url_verify()

function url_allowed_host( $host ) {

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

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

    return false;      
}

parse entered url, force https, verify allowed host, create and return array of values

   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;

       }

   } 
Save the array with url and url host name

  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\' );
    }    


  }

Retrieve the values

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

Displaying something conditionally per host

我在这里使用一个开关,以防您有一个更长的允许域列表。

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

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

结束

相关推荐

从Metabox数字中去掉十进制

我正在Wordpress网站上为一位客户展示几个房产清单及其相关价格。当我在开发人员创建的元数据库中输入数字时,它会去掉所有的小数。因此,如果我输入16.50,当页面保存时,它会立即变为1650。我希望它能显示2个小数。我做了一些研究,但我对PHP/Wordpress的知识还不够渊博,无法理解。开发人员指示我调整代码的格式,但只需在数字上添加2个小数,以显示1650.00,而不是我想要的16.50。在元数据库中输入小数点后,它会立即被删除。我觉得好像在某个地方定义了某种东西,从这个输入字段中去掉了所有的小