web-dev-qa-db-fra.com

Composants utilisés dans les thèmes et les plugins: Comment obtenir l'URL du fichier?

Dans mes projets, j'ai certains composants que j'utilise dans de nombreux plug-ins personnalisés, ainsi que dans des thèmes codés tels que, par exemple, image admin ou sélecteurs vidéo.

Ceux que je tiens dans des dépôts git personnalisés. Cependant, étant donné que ces composants sont utilisés dans les deux thèmes - et les plugins - je dois toujours modifier manuellement les getters d'URL après l'extraction de GIT. Si les composants existent plusieurs fois, ce n'est pas un problème. J'ai enveloppé ceux-ci avec function_exists.

C'est ce que j'utilise dans le thème:

wp_enqueue_script(get_template_directory_uri().'/libs/my_lib/admin_image_upload', ...);

C'est ce que j'utilise dans un plugin:

wp_enqueue_script(plugins_url(__FILE__).'admin_image_upload.js', ...);

Existe-t-il un moyen de déterminer si mon fichier PHP actuel se trouve dans le dossier des plugins ou dans le dossier des thèmes afin de pouvoir décider automatiquement du bon chemin?

1
Blackbam

Est-il possible de déterminer si mon fichier PHP actuel se trouve dans le dossier des plugins ou dans le dossier themes

De manière générale, vous avez toujours le chemin du fichier actuel (__FILE__) afin que vous puissiez toujours l'examiner pour savoir où vous en êtes et le comparer au contexte. Cela peut être suffisant dans un site personnalisé, mais probablement trop fragile pour un code public. Il existe de nombreux cas Edge avec des chemins, car ils peuvent être hautement personnalisés.

Ce que vous avez n’est pas seulement un problème d’actif , mais un problème de dépendance - comment Réutilisez-vous plusieurs composants, de différentes manières et sans conflit?.

Personnellement, j’envisageais fortement d’utiliser Composer, car c’est un moyen pratique de gérer les dépendances dans PHP moderne. C’est… pas parfait pour les bizarreries d’extensions WP distribuées publiquement, mais votre cas ressemble davantage à un travail personnalisé, de toute façon.

2
Rarst

Voici une solution qui renverra l'URL d'un fichier par rapport à son emplacement, ainsi qu'une chaîne indiquant l'emplacement du fichier, c'est-à-dire mu-plugins/plugins/theme.

Ce code a été adapté de get_url_from_dir() utilisé dans la bibliothèque de méta-boîtes CMB2 .

/**
 * Converts a system file path to a URL.
 * Returns URL and the detected location of the file.
 *
 * Based on get_url_from_dir() via CMB2
 * @link https://github.com/CMB2/CMB2
 * 
 * @param  string $file file path to convert.
 * @return string Converted URL.
 * @return array|bool (on error)
 *  array
 *    $url string Converted URL.
 *    $location string location of dir (mu-plugins, plugins, theme)
 *
 */
function wpse_get_url_info_from_file( $file ) {
    $file = wp_normalize_path( $file );
    $test_dir = pathinfo( $file );

    if ( ! $test_dir ) {
        return false;
    }

    $test_dir = trailingslashit( $test_dir['dirname'] );

    // Test if we are in the mu-plugins dir.
    if ( 0 === strpos( $test_dir, wp_normalize_path( WPMU_PLUGIN_DIR ) ) ) {
        return [
            'url' => trailingslashit( plugins_url( '', $file ) ),
            'location' => 'mu-plugins'
        ];
    }

    // Test if we are in the plugins dir.
    if ( 0 === strpos( $test_dir, wp_normalize_path( WP_PLUGIN_DIR ) ) ) {
        return [
            'url' => trailingslashit( plugins_url( '', $file ) ),
            'location' => 'plugins'
        ];
    }

    // Now let's test if we are in the theme dir.
    $theme_root = wp_normalize_path( get_theme_root() );
    if ( 0 === strpos( $file, $theme_root ) ) {
        // Ok, then use get_theme_root_uri.
        $url = set_url_scheme(
            trailingslashit(
                str_replace(
                    untrailingslashit( $theme_root ),
                    untrailingslashit( get_theme_root_uri() ),
                    $test_dir
                )
            )
        );

        return [
            'url' => $url,
            'location' => 'theme'
        ];
    }
}

Par exemple, si nous avons un plugin nommé wpse résidant dans plugins-directory/wpse et un thème nommé my-theme, nous pouvons utiliser le code suivant dans le plugin ou dans le thème pour mettre en file d'attente le fichier admin_image_upload.js, qui réside dans des répertoires différents du plugin et du thème.

add_action( 'wp_enqueue_scripts', 'wpse_enqueue_js_based_on_location' );
function wpse_enqueue_js_based_on_location() {
    $url_info = wpse_get_url_info_from_file( __FILE__ );
    //exit ( print_r( $url_info ) );

    // Bail if something is wrong.
    if ( ! $url_info ) {
        return;
    }

    // Bail if something is wrong.
    if ( ! isset( $url_info['url'] ) || ! isset( $url_info['location'] ) ) {
        return;
    }

    // Enqueue the JS based on detected location of the file.
    if ( 'plugins' === $url_info['location'] ) {
        wp_enqueue_script( 'wpse-js',  plugins_url( '/admin_image_upload.js', __FILE__ ) );
    } elseif ( 'theme' === $url_info['location'] ) {
        wp_enqueue_script( 'wpse-js', get_template_directory_uri() . '/libs/my_lib/admin_image_upload.js' );
    }
}

Lorsque vous utilisez le code ci-dessus à partir d'un fichier du répertoire racine du plug-in wpse, $url_info se présentera comme suit:

Array(
    [url] => http://example.com/wp-content/plugins/wpse/
    [location] => plugins
)

Si nous exécutons le même code depuis le functions.php d'un thème, $url_info ressemblera à ceci:

Array(
    [url] => http://example.com/wp-content/themes/my-theme/
    [location] => theme
)
1
Dave Romsey