Aggiungere l'orario dell'ultima modifica come versione a CSS e JS

11 giu 2017, 00:07:11
Visualizzazioni: 20.1K
Voti: 3

Sono riuscito ad aggiungere l'orario dell'ultima modifica come versione ai file css e js. Come si può vedere devo ripetere filemtime(get_theme_file_path('...')) ogni volta che viene aggiunto un nuovo link.

function _enqueue_scripts() {
    wp_enqueue_style('_base', get_theme_file_uri('/assets/css/base.css'), array(), filemtime(get_theme_file_path('/assets/css/base.css')));
    wp_enqueue_script('_base', get_theme_file_uri('/assets/js/base.js'), array(), filemtime(get_theme_file_path('/assets/js/base.js')));
}
add_action('wp_enqueue_scripts', '_enqueue_scripts');

C'è un modo per utilizzare un filtro personalizzato o qualcosa di simile invece di aggiungere manualmente quella riga ogni volta?

Simile alla funzione qui sotto (per rimuovere i numeri di versione), ma vorrei aggiungere i numeri di versione.

function _remove_script_version($src) {
    return $src ? esc_url(remove_query_arg('ver', $src)) : false;
}
add_filter('style_loader_src', '_remove_script_version', 15, 1);
add_filter('script_loader_src', '_remove_script_version', 15, 1);
0
Tutte le risposte alla domanda 5
0

Potresti usare add_query_arg() ma poi dovresti analizzare l'URI ogni volta, preferirei creare una funzione wrapper per wp_enqueue_script/style:

function my_enqueuer($my_handle, $relpath, $type='script', $my_deps=array()) {
    $uri = get_theme_file_uri($relpath);
    $vsn = filemtime(get_theme_file_path($relpath));
    if($type == 'script') wp_enqueue_script($my_handle, $uri, $my_deps, $vsn);
    else if($type == 'style') wp_enqueue_style($my_handle, $uri, $my_deps, $vsn);      
}

Aggiungi questo nel tuo file functions e poi al posto di ad esempio

wp_enqueue_script('_base', get_theme_file_uri('/assets/js/base.js'), array(), filemtime(get_theme_file_path('/assets/js/base.js')));

chiama:

my_enqueuer('_base', '/assets/js/base.js');

e al posto di ad esempio

wp_enqueue_style('_base', get_theme_file_uri('/assets/css/base.css'), array(), filemtime(get_theme_file_path('/assets/css/base.css')));

chiama:

my_enqueuer('_base', '/assets/css/base.css', 'style');

Puoi passare l'array delle dipendenze come ultimo argomento quando necessario. Per gli script, se passi l'array delle dipendenze, dovrai passare anche il terzo parametro 'script', anche se l'ho impostato come valore predefinito.

11 giu 2017 01:32:37
0

In precedenza utilizzavo il formato YYYYMMDD come numero di versione per i file caricati con enqueue, soluzione ragionevolmente valida, ma che causava problemi quando il file veniva modificato più volte nello stesso giorno e comunque richiedeva di ricordarsi di aggiornare manualmente il numero di versione ad ogni modifica al file. Un esempio di enqueue poteva essere simile a questo:

<?php wp_enqueue_style( 'child-theme', get_stylesheet_directory_uri() . '/css/styles.css', array(), '20150731' ); ?>

Il mio approccio rivisto consiste nel creare prima una variabile per il percorso del file CSS/JS e poi utilizzare filemtime come numero di versione invece di YYYYMMDD:

<?php
$themecsspath = get_stylesheet_directory() . '/css/styles.css';
wp_enqueue_style(
    'child-theme',
    get_stylesheet_directory_uri() . '/css/styles.css',
    array(),
    filemtime( $themecsspath )
);
?>

Ora, invece di avere nei file enqueued il numero di versione di WordPress, come in questo esempio:

<link rel='stylesheet' id='child-theme-css'  href='http://example.com/wp-content/themes/child/css/styles.css?ver=4.3.1' type='text/css' media='all' />

Appariranno in questo modo:

<link rel='stylesheet' id='child-theme-css'  href='http://example.com/wp-content/themes/child/css/styles.css?ver=1447781986' type='text/css' media='all' />
8 feb 2018 08:46:43
0

Questa risposta è stata adattata dalla soluzione di @CGodo.

Stavo ricevendo errori fatali con il codice originale. Ho testato questo codice e fa ciò che credo fosse l'intenzione della risposta originale.

/**
 * Sostituisce la versione della query negli script o stili registrati con l'ora di modifica del file
 *
 * @param $src
 *
 * @return string
 */
function add_modified_time( $src ) {

    $clean_src = remove_query_arg( 'ver', $src );
    $path      = wp_parse_url( $src, PHP_URL_PATH );

    if ( $modified_time = @filemtime( untrailingslashit( ABSPATH ) . $path ) ) {
        $src = add_query_arg( 'ver', $modified_time, $clean_src );
    } else {
        $src = add_query_arg( 'ver', time(), $clean_src );
    }

    return $src;

}

add_filter( 'style_loader_src', 'add_modified_time', 99999999, 1 );
add_filter( 'script_loader_src', 'add_modified_time', 99999999, 1 );
27 ago 2019 16:46:57
1

Se per qualche motivo qualcuno ne ha bisogno, questi hook aggiungeranno versioni basate sull'ora di modifica a tutti gli script e stili di WordPress, eccetto quelli caricati da PHP.

Il motivo per cui utilizza le istanze singleton WP_Scripts e WP_Styles è perché queste istanze hanno già calcolato il base_url.

/**
 * Sostituisce la versione query negli script o stili registrati con l'ora di modifica del file
 * @param string $src URL sorgente
 * @param string $baseUrl URL base del sito
 * @return string
 */
function put_modified_time_version($src, $baseUrl)
{
    // Lavora solo con oggetti da baseUrl
    if ($src && strpos($src, $baseUrl) === 0) {
        // Rimuove qualsiasi versione
        $newSrc = remove_query_arg('ver', $src);
        // Ottiene il percorso dopo base_url
        $path = substr($newSrc, strlen($baseUrl));
        $path = wp_parse_url($path, PHP_URL_PATH);
        // Applica la versione basata sull'ora di modifica se esiste
        if ($mtime = @filemtime(untrailingslashit(ABSPATH) . $path)) {
            $src = add_query_arg('ver', $mtime, $newSrc);
        }
    }
    return $src;
}

/**
 * Filtra le sorgenti degli stili per aggiungere l'ora di modifica come query string
 * @param $src
 * @return string
 */
function modified_time_version_style($src) {
    // base_url da WP_Versions è già in memoria
    return ($src) ? put_modified_time_version($src, wp_styles()->base_url) : $src;
}

/**
 * Filtra le sorgenti degli script per aggiungere l'ora di modifica come query string
 * @param $src
 * @return string
 */
function modified_time_version_script($src) {
    // base_url da WP_Styles è già in memoria
    return ($src) ? put_modified_time_version($src, wp_scripts()->base_url) : $src;
}

add_filter('style_loader_src', 'modified_time_version_style', 15, 1);
add_filter('script_loader_src', 'modified_time_version_script', 15, 1);
20 feb 2018 02:48:26
Commenti

Ho cercato tutto il giorno una soluzione per versionare i miei fogli di stile. Ho avuto un problema nell'utilizzare questo metodo per tutti gli script, quindi ho semplicemente commentato il filtro per gli script dato che non ne avevo bisogno per quel caso d'uso.

Nota: ho dovuto cambiare la priorità da 15 a 9999 per farlo funzionare nel mio caso. Sono sicuro che i plugin che volevo modificare avevano impostato una priorità più alta del dovuto.

Mike Averto Mike Averto
14 dic 2020 00:57:05
0

Ho appena scritto due metodi per la mia classe plugin, che rendono super semplice registrare e accodare script e stili. E naturalmente, come desiderato, viene sempre aggiunto l'ultimo tempo di modifica come parametro della versione. Forse questo aiuterà qualcuno.

Come usarli:

/**
 * Per questi esempi assumiamo che i tuoi asset del plugin siano posizionati in
 * wp-content/plugins/my-plugin/path/to/assets/
 */

// aggiungi il tuo stile
$this->registerAsset('path/to/assets/your-style.css');

// aggiungi il tuo script funziona esattamente allo stesso modo
$this->registerAsset('path/to/assets/your-script.js');

// aggiungi uno script con dipendenza
$this->registerAsset('path/to/assets/script-with-dependencies.js', [
    'jquery'
]);

// aggiungi uno script con dipendenza interna
$this->registerAsset('path/to/assets/script-with-dependencies.js', [
    'jquery',
    $this->getAssetHandle('path/to/assets/your-script.js')
]);

// per le dipendenze interne puoi anche passare direttamente il percorso della dipendenza
$this->registerAsset('path/to/assets/script-with-dependencies.js', [
    'jquery',
    'path/to/assets/your-script.js'
]);

Ci sono alcune opzioni in più, ma controlla la documentazione sui metodi nel codice sorgente che ti servono:

class myPlugin
{
    public function __construct()
    {
    }
    
    /**
     * Registra e accoda uno script o uno stile
     * 
     * @param   STRING        $path          Il percorso del file che vuoi registrare o accodare (relativo alla cartella del tuo plugin).
     * @param   ARRAY         $dependencies  Le dipendenze come le conosci da wp_enqueue_script, ma permette anche percorsi di altri asset registrati con questo metodo.
     * @param   BOOLEAN       $enqueue       Se FALSE verrà solo registrato, altrimenti verrà anche accodato.
     * @param   STRING|NULL   $type          Tipo dell'asset. I tipi permessi sono 'script' e 'style'. Se è NULL, il tipo viene rilevato automaticamente dall'estensione del file.
     * @param   STRING        $media         Per definire 'media' quando aggiungi CSS (Ignorato per asset JS - gli asset JS ricevono sempre TRUE per il parametro in_footer poiché questo è solitamente il modo consigliato)
     * 
     * @return  BOOLEAN|NULL  Quando $enqueue è TRUE, il valore di ritorno è sempre NULL. Altrimenti TRUE in caso di successo, FALSE in caso di fallimento.
     */
    public function registerAsset($path, $dependencies = [], $enqueue = true, $type = null, $media = 'all')
    {
        $path = '/' . ltrim($path, '/');
        $pluginDirName = explode(DIRECTORY_SEPARATOR, ltrim(str_replace(realpath(WP_PLUGIN_DIR), '', realpath(__FILE__)), DIRECTORY_SEPARATOR), 2)[0];
        $pluginDir = realpath(WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $pluginDirName);

        if ($type === null) {
            $extensions = ['js' => 'script', 'css' => 'style'];
            $extension = pathinfo($path, PATHINFO_EXTENSION);
            $type = isset($extensions[$extension]) ? $extensions[$extension] : null;
        }
        if (!in_array($type, ['script', 'style']) || !file_exists($pluginDir . $path)) {
            return;
        }

        foreach ($dependencies as $index => $dependency) {
            if (preg_match('/\.(js|css)$/', $dependency) && file_exists($pluginDir . DIRECTORY_SEPARATOR . ltrim($dependency, '\\/'))) {
                $dependencies[$index] = $this->getAssetHandle($dependency);
            }
        }

        $func = 'wp_' . ($enqueue ? 'enqueue' : 'register') . '_' . $type;
        return $func($this->getAssetHandle($path), plugins_url($pluginDirName . $path), $dependencies, filemtime($pluginDir . $path), $type === 'script' ? true : $media);
    }

    /**
     * Ottiene l'handle di un asset che registerAsset() usa automaticamente
     * 
     * @param   STRING        $path          Il percorso che hai usato con registerAsset()
     * 
     * @return  STRING        Il nome handle dell'asset
     */
    public function getAssetHandle($path)
    {
        $pluginDirName = explode(DIRECTORY_SEPARATOR, ltrim(str_replace(realpath(WP_PLUGIN_DIR), '', realpath(__FILE__)), DIRECTORY_SEPARATOR), 2)[0];
        return preg_replace('/[^a-zA-Z0-9]+/', '-', $pluginDirName . '-' . $path);
    }
}
9 lug 2021 19:13:17