web-dev-qa-db-fra.com

Comment puis-je obtenir un chemin de lien à utiliser pour mes ressources telles que les scripts JS?

Existe-t-il une fonction qui retournerait l'équivalent de plugin_dir_path mais agnostique d'un plugin/thème? Les scripts JS doivent être mis en file d'attente en tant que ressources, en tant que tels, vous ne pouvez pas inclure leur chemin d'accès sur le serveur, c'est-à-dire /var/www/html/wordpress/thing/thing2/script.js, ce doit être le http://www.example.com/thing/thing2/script.js homologue.

2
Daniel Smith

Bien que la réponse de @ butlerblog fonctionne, je la trouve inutilement complexe. J'ai vérifié au-delà, site_url vous donnera toujours le lien du site actuel, il résoudra les schémas pour vous, qu'il s'agisse de http ou https, etc. et en tant que tel, il n'y a aucun problème.

J'ai écrit une fonction plus simple et plus facile à comprendre:

/**
 * Retrieves the full front-facing URL for a given path. In other words, it transforms an absolute path
 * into an URI.
 *
 * Note: when allowing direct access to your files, if there is any I/O (there shouldn't be, but, you know) operations,
 * you must check whether or not ABSPATH is defined.
 *
 * @see https://stackoverflow.com/a/44857254/12297763
 *
 * @param string $from An absolute path. You can just call this function with the parameter __FILE__ and it will give you a front-facing URI for that file.
 * @param boolean $strict Flag that the function uses to see if it needs to do additional checks.
 *
 * @return string|false Returns a string in the form of an URI if all checks were passed or False if checks failed.
 */
function getURIFromPath( $from, $strict = False )
{
    if( $strict ) {
        if( !\file_exists( $from ) ) {
            return False;
        }
    }

    $abspath = untrailingslashit( ABSPATH ) ;

    $directory = dirname( $from );

    return str_replace( "//", "\\", site_url() . str_replace( $abspath, '',  $directory ) );
}

Le raisonnement pour le nommer URI... est qu'il n'y a aucun cas où vous allez construire un lien pour inclure un fichier PHP. Ceci doit être utilisé dans le cas où vous distribuez votre code sous forme de package et ne peut pas s'appuyer sur votre framework principal/plugin CONSTANTS. En d'autres termes, lorsque vous ne connaissez pas le chemin d'installation de votre package, utilisez-le. Il fonctionnera de la même manière que CSS '../ (toujours relatif).

1
Daniel Smith

C'est une sorte de méthode hacky pour le faire; mais malheureusement, il n'y a pas de fonction WP qui fera les deux (thème et/ou plugin). Ce n'est qu'une proposition soit/soit.

En surface, on pourrait penser que ce ne serait pas difficile. Vous pouvez simplement obtenir le chemin d'accès et le comparer avec l'URL du site ou quelque chose comme ça. Mais vous rencontrez des problèmes lorsque WP est installé ailleurs que dans la racine (comme dans un répertoire).

Si vous regardez ma configuration dans la fonction, la condition "else" est simple. Si WP était toujours à la racine, ce serait tout ce que vous devez faire. Tout le reste est fait pour gérer l'autre possibilité (que WP est dans un répertoire - ou inférieur).

Dans ce cas, il explose l'URL du site pour déterminer s'il n'y a pas que le domaine racine (un tableau supérieur à 3). Si c'est le cas, il parcourt les parties de l'URL que nous avons obtenues du processus explode(). Nous pouvons ignorer les trois premiers éléments du tableau car ceux-ci doivent être la racine du domaine ( https://example.com ). Ensuite, il construit le chemin (au cas où il s'agirait de plus d'un répertoire ci-dessous).

En utilisant cela, il supprime tout ce qui se trouve sous l'URL racine afin que vous obteniez juste une URL propre que vous pouvez utiliser. Ensuite, il ajoute le chemin d'accès au fichier.

function my_get_file_url_path() {

    // Account for WP being installed in a directory.
    $path_info = '';
    $site_url  = site_url();
    $url_parts = explode( '/', $site_url );

    if ( array_count_values( $url_parts ) > 3 ) {
        $x = 0;
        foreach ( $url_parts as $this_part ) {
            if ( $x > 2 ) {
                $path_info = $this_part . '/';
            }
            $x++;
        }

        $site_actual_url = str_replace( $path_info, '', trailingslashit( $site_url ) );

        return $site_actual_url . trim( str_replace( $_SERVER['DOCUMENT_ROOT'], '', __DIR__ ), '/' );

    } else {
        return str_replace( $_SERVER['DOCUMENT_ROOT'], $site_url, __DIR__ );
    }
}
1
butlerblog