Adaugă timpul ultimei modificări ca versiune pentru fișierele CSS și JS

11 iun. 2017, 00:07:11
Vizualizări: 20.1K
Voturi: 3

Am reușit să adaug timpul ultimei modificări ca versiune pentru fișierele css și js. După cum se poate vedea, trebuie să repet filemtime(get_theme_file_path('...')) de fiecare dată când este adăugat un nou 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');

Există vreo modalitate de a utiliza un filtru personalizat sau ceva similar pentru aceasta, în loc să adaug manual acea linie de fiecare dată?

Similar cu funcția de mai jos (pentru eliminarea numerelor versiunii), dar aș dori să adaug numere de versiune.

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
Toate răspunsurile la întrebare 5
0

Ai putea folosi add_query_arg() dar atunci ar trebui să analizezi URI-ul de fiecare dată, aș prefera să creez o funcție wrapper pentru 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);      
}

Adaugă acest cod în fișierul tău de funcții și apoi în loc de exemplu:

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

apelează:

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

și în loc de exemplu:

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

apelează:

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

Poți transmite array-ul de dependențe ca ultim argument atunci când este necesar. Pentru scripturi, dacă transmiți array-ul de dependențe, va trebui să transmiți și al treilea parametru 'script', chiar dacă l-am setat ca valoare implicită.

11 iun. 2017 01:32:37
0

Obișnuiam să folosesc formatul AAAALLZZ ca număr de versiune pentru fișierele încărcate, ceea ce era destul de bun, dar provoca probleme când se schimba de mai multe ori într-o zi și tot trebuia să-mi amintesc să actualizez numărul de versiune când se făceau modificări în fișier. Un exemplu de încărcare ar fi putut arăta astfel:

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

Abordarea mea revizuită începe prin crearea unei variabile pentru calea fișierului CSS/JS și apoi folosirea funcției filemtime în locul numărului de versiune AAAALLZZ:

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

Acum, în loc ca fișierele mele încărcate să conțină numărul de versiune WordPress, astfel:

<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' />

Acum arată astfel:

<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

Acest răspuns a fost adaptat din soluția lui @CGodo.

Am întâmpinat erori fatale cu codul original. Am testat acest cod și face ceea ce cred că era intenționat în răspunsul original.

/**
 * Înlocuiește versiunea din interogările în scripturile sau stilurile înregistrate cu timpul de modificare al fișierului
 *
 * @param $src
 *
 * @return string
 */
function adauga_timp_modificat( $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', 'adauga_timp_modificat', 99999999, 1 );
add_filter( 'script_loader_src', 'adauga_timp_modificat', 99999999, 1 );
27 aug. 2019 16:46:57
1

Dacă din anumite motive cineva are nevoie de aceste funcții, aceste hook-uri vor adăuga versiuni bazate pe timpul de modificare la toate scripturile și stilurile WordPress, cu excepția celor încărcate din PHP.

Motivul pentru care folosește singleton-urile WP_Scripts și WP_Styles este pentru că aceste instanțe au deja calculat base_url.

/**
 * Înlocuiește versiunea din query în scripturile sau stilurile înregistrate cu timpul de modificare al fișierului
 * @param string $src URL sursă
 * @param string $baseUrl URL-ul de bază al site-ului
 * @return string
 */
function put_modified_time_version($src, $baseUrl)
{
    // Lucrează doar cu obiectele din baseUrl
    if ($src && strpos($src, $baseUrl) === 0) {
        // Elimină orice versiune
        $newSrc = remove_query_arg('ver', $src);
        // Obține calea după base_url
        $path = substr($newSrc, strlen($baseUrl));
        $path = wp_parse_url($path, PHP_URL_PATH);
        // Aplică versiunea bazată pe timpul de modificare dacă există
        if ($mtime = @filemtime(untrailingslashit(ABSPATH) . $path)) {
            $src = add_query_arg('ver', $mtime, $newSrc);
        }
    }
    return $src;
}

/**
 * Filtrează sursele stilurilor pentru a adăuga timpul de modificare ca query string
 * @param $src
 * @return string
 */
function modified_time_version_style($src) {
    // base_url din WP_Versions este deja în memorie
    return ($src) ? put_modified_time_version($src, wp_styles()->base_url) : $src;
}

/**
 * Filtrează sursele scripturilor pentru a adăuga timpul de modificare ca query string
 * @param $src
 * @return string
 */
function modified_time_version_script($src) {
    // base_url din WP_Styles este deja în memorie
    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
Comentarii

Am căutat asta toată ziua pentru o modalitate de a versiunea fișierele mele de stiluri. Am întâmpinat o problemă folosind asta pentru toate scripturile, dar pur și simplu am comentat filtrul pentru scripturi, deoarece nu aveam nevoie pentru acel caz de utilizare.

Notă, a trebuit să schimb prioritatea de la 15 la 9999 pentru a funcționa în cazul meu. Sunt sigur că plugin-urile pe care le targetam au pus prioritatea mai mare decât ar fi trebuit.

Mike Averto Mike Averto
14 dec. 2020 00:57:05
0

Tocmai am scris două metode pentru clasa mea de plugin, care fac extrem de ușoară înregistrarea și încărcarea scripturilor și stilurilor. Și bineînțeles, după cum era de dorit, ultima dată de modificare este întotdeauna adăugată ca parametru de versiune. Poate că acest lucru îi va ajuta pe cineva.

Cum să le folosești:

/**
 * Pentru aceste exemple, presupunem că resursele pluginului tău sunt localizate în
 * wp-content/plugins/my-plugin/path/to/assets/
 */

// adaugă stilul tău
$this->registerAsset('path/to/assets/your-style.css');

// adaugă scriptul tău funcționează exact la fel
$this->registerAsset('path/to/assets/your-script.js');

// adaugă script cu dependință
$this->registerAsset('path/to/assets/script-with-dependencies.js', [
    'jquery'
]);

// adaugă script cu dependință internă
$this->registerAsset('path/to/assets/script-with-dependencies.js', [
    'jquery',
    $this->getAssetHandle('path/to/assets/your-script.js')
]);

// pentru dependințele interne poți să transmiți și calea directă a dependinței
$this->registerAsset('path/to/assets/script-with-dependencies.js', [
    'jquery',
    'path/to/assets/your-script.js'
]);

Există câteva opțiuni suplimentare, dar verifică documentația despre metodele din codul sursă pe care le ai nevoie:

class myPlugin
{
    public function __construct()
    {
    }
    
    /**
     * Înregistrează și încarcă un script sau un stil
     * 
     * @param   STRING        $path          Calea fișierului pe care dorești să-l înregistrezi sau să-l încarci (relativă la folderul pluginului tău).
     * @param   ARRAY         $dependencies  Dependințele așa cum le cunoști din wp_enqueue_script, dar permite și căi către alte resurse care au fost înregistrate cu această metodă.
     * @param   BOOLEAN       $enqueue       Dacă este FALSE, va fi doar înregistrat, altfel va fi și încărcat.
     * @param   STRING|NULL   $type          Tipul resursei. Tipurile permise sunt 'script' și 'style'. Dacă este NULL, tipul este detectat automat din extensia fișierului.
     * @param   STRING        $media         Pentru a defini 'media' când adaugi CSS (Ignorat pentru resursele JS - resursele JS primesc întotdeauna TRUE pentru parametrul in_footer deoarece acesta este modul recomandat de obicei)
     * 
     * @return  BOOLEAN|NULL  Când $enqueue este TRUE, valoarea returnată este întotdeauna NULL. Altfel TRUE în caz de succes, FALSE în caz de eșec.
     */
    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);
    }

    /**
     * Obține handle-ul unei resurse pe care registerAsset() îl folosește automat
     * 
     * @param   STRING        $path          Calea pe care ai folosit-o cu registerAsset()
     * 
     * @return  STRING        Numele handle-ului resursei
     */
    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 iul. 2021 19:13:17