validationsfunktion für die URL im Plugin

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

Das obige ist ein Teil des Codes von einem Plugin . Dann kommt hier die function

 function cpmb_is_valid_mp3( $filename ) { $path_parts = pathinfo( $filename ); return 'mp3' == strtolower( $path_parts['extension'] ); } 

Lassen Sie mich Ihnen sagen, was ich verstehe : Wenn es validiert wird, dass die Datei .mp3 dann .mp3 den Code aus?

FRAGE : Kann mir jemand helfen, solche validationen für eine “URL” zu erstellen?

Ich habe es so versucht →

 if ( cpmb_is_valid_url( $_REQUEST['video-url']['name'] ) ) { Some code is executed here. } 

Aber ich habe keine Ahnung, wie man diese function schreibt →

 cpmb_is_valid_url 

Solutions Collecting From Web of "validationsfunktion für die URL im Plugin"

Ich würde in PHP parse_url() und / oder filter_var() mit Filter FILTER_VALIDATE_URL suchen . parse_url() gibt Ihnen ein bisschen mehr Kontrolle. Kombinieren Sie das mit einer Desinfektion wie am Ende erwähnt.

Hier sind paar Anwendungsfälle, die Ihnen hoffentlich eine bessere Vorstellung davon geben, wie es weitergeht:


Wenn Sie überprüfen möchten, ob die Domain der URL einer genehmigten Site entspricht:

 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; } 

Übergeben Sie dann die URL, um innerhalb Ihrer Bedingung zu überprüfen:

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

Wenn Sie nur bestätigen wollen, dass es sich um eine URL handelt (die ftp:// usw., btw) enthält,

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

Wenn Sie URLs nur mit http oder https beginnen möchten ,

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

Ich würde auch empfehlen, die URL entweder über das WordPress esc_url() oder php’s filter_var( $url, FILTER_SANITIZE_URL )


Bearbeiten: Mit WP’s wp_parse_url()

WordPress bietet einen Wrapper für PHP parse_url() : wp_parse_url() . Es gibt ein Array von 'scheme' , 'host' und 'path' . Die Verwendung ist die gleiche wie oben:

 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; } 

Darüber hinaus gibt die WordPress-function wp_allowed_protocols() eine Standardliste von Protokollen zurück, gegen die Sie überprüfen könnten:

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

Sie können diese Liste mit dem Haken kses_allowed_protocols . Im Beispiel könnte das Entfernen des mailto Protokolls in etwa so aussehen:

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

Beachten Sie, dass diese Liste genehmigter Protokolle von _links_add_base() , edit_user() (für das Benutzer-URL-Feld), wp_kses() , wp_kses_one_attr() und esc_url() .

Ich würde behaupten, dass es besser ist, das beabsichtigte Protokoll des Eingabefelds explizit zu überprüfen, anstatt es nur mit diesem Array zu überprüfen.


Ein vollständigerer Anwendungsfall

Da Sie Benutzern erlauben, URLs von bestimmten Sites einzugeben, und in beiden Fällen werden diese Video-URLs mit dem Protokoll https , würde ich nach dem Site- host esc_url() und das Protokoll erzwingen und esc_url() , um Zeichen zu bereinigen.

Da das Endergebnis erfordert, dass Sie wissen, ob die URL Vimeo oder Youtube ist, können Sie das auch speichern.

Check gegen erlaubte Hosts, benutzt von 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 eingegebene URL, erzwinge https, verifiziere erlaubten Host, erzeuge und gebe Array von Werten zurück

  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; } } 

Speichern Sie das Array mit dem URL- und URL-Hostnamen

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

Abrufen der Werte

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

Etwas bedingt für jeden Host anzeigen

Ich benutze einen Schalter für den Fall, dass Sie eine längere Liste von erlaubten Domains haben.

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