web-dev-qa-db-fra.com

Fonction de validation pour l'URL dans le 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' );
        }

Ce qui précède fait partie du code d’un plugin . Puis voici la fonction

function cpmb_is_valid_mp3( $filename ) {

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

}

Laissez-moi vous dire ce que je comprends : S'il est validé, le fichier est .mp3, puis exécutez le code ?

QUESTION: Quelqu'un peut-il m'aider à créer de telles validations pour une "URL"?

J'ai essayé comme ça →

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

   Some code is executed here.

}

Mais je ne sais pas comment écrire cette fonction →

cpmb_is_valid_url
1
The WP Novice

Je voudrais examiner PHP parse_url() et/ou filter_var() avec le filtre FILTER_VALIDATE_URL . parse_url() vous donne un peu plus de contrôle. Combinez cela avec une désinfection comme mentionné à la fin.

Voici quelques cas d'utilisation qui, espérons-le, vous donneront une meilleure idée de la façon de procéder:


Si vous voulez vérifier que le domaine de l'URL appartient à un site approuvé:

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

Puis passez l'URL à vérifier dans votre conditionnel:

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

Si vous voulez juste confirmer qu'il s'agit bien d'une URL (qui inclura ftp://, etc., btw),

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

Si vous souhaitez autoriser uniquement les URL commençant par http ou https,

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

Je voudrais également recommandé de désinfecter l'URL via Wordpress esc_url() ou php's filter_var( $url, FILTER_SANITIZE_URL )


Edit: Utiliser la fonction wp_parse_url() de WP

Wordpress fournit un wrapper pour parse_url(): wp_parse_url() de PHP. Il retourne un tableau de 'scheme', 'Host' et 'path'. L'utilisation est la même que ci-dessus:

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

De plus, la fonction wordpress wp_allowed_protocols() renvoie une liste par défaut de protocoles sur lesquels vous pourriez effectuer une vérification:

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

Vous pouvez filtrer cette liste avec le hook kses_allowed_protocols . Par exemple, la suppression du protocole mailto peut ressembler à ceci:

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

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

Notez que cette liste de protocoles approuvés est utilisée par _links_add_base() , edit_user() (pour le champ URL de l'utilisateur), wp_kses() , wp_kses_one_attr() , et esc_url() .

Je dirais qu'il est préférable de vérifier explicitement le protocole prévu du champ d'entrée plutôt que de simplement le comparer à ce tableau.


Un cas d'utilisation plus complet

Dans la mesure où votre utilisation consiste à permettre aux utilisateurs de saisir des URL à partir de sites spécifiques et, dans les deux cas, ces URL de vidéo sont servies à l'aide du protocole https, je rechercherais le site Host et forcerais le protocole, puis utiliser esc_url() pour nettoyer les caractères.

Comme le résultat final vous demandera de savoir si l'URL est vimeo ou youtube, vous pouvez également l'enregistrer.

vérifier par rapport aux hôtes autorisés, utilisé par url_verify()

function url_allowed_Host( $Host ) {

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

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

    return false;      
}

analyser l'URL entrée, forcer https, vérifier l'hôte autorisé, créer et renvoyer un tableau de valeurs

   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;

       }

   } 

Enregistrez le tableau avec l'URL et l'URL Nom d'hôte

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


  }

Récupérer les valeurs

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

Afficher quelque chose conditionnellement par hôte

J'utilise un commutateur ici au cas où vous auriez une liste plus longue de domaines autorisés.

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

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