我会调查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清理url
esc_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;
}