Jak dodać opcje CSS do mojej wtyczki bez używania stylów wbudowanych?


26

Niedawno wydałem wtyczkę, WP Coda Slider , która używa skrótów, aby dodać suwak jQuery do dowolnego posta lub strony. Dodaję stronę opcji w następnej wersji i chciałbym uwzględnić niektóre opcje CSS, ale nie chcę, aby wtyczka dodawała opcje stylu jako wbudowany CSS. Chcę, aby wybory były dynamicznie dodawane do pliku CSS po jego wywołaniu.

Chciałbym również unikać używania fopen lub pisania do pliku ze względów bezpieczeństwa.

Czy jest coś takiego łatwego do osiągnięcia, czy lepiej byłoby po prostu dodać opcje stylu bezpośrednio na stronie?


@Chris_O : Myślałem o prawie dokładnie tym samym. To, czego chcę, to sposób na wywołanie wp_enqueue_style()(i wp_enqueue_script()) nazwy funkcji zamiast nazwy pliku i spowodowanie, że moja funkcja wygeneruje CSS (lub JS), ale mimo to ostatecznie umieści go w połączonym arkuszu stylów. O ile wiem, nie jest to możliwe w przypadku wp_equeue_*()funkcji. Może powinniśmy przesłać bilet trac?
MikeSchinkel,

@MikeSchinkel: Byłby to bardzo logiczny sposób korzystania z funkcji wp_enqueue. Dodałbym obsługę tego biletu.
Chris_O,

@Chris_O: Właśnie widziałem odpowiedź @ Douga; Zrobiłem złe założenie, że już to wiesz. Gdybym zdał sobie sprawę, że tak nie jest,
wskazałbym

@MikeSchinkel Wiedziałem o wp_register i wp_enqueue. Szukałem sposobu na zbudowanie arkusza stylów na podstawie wartości ze strony opcji wtyczek.
Chris_O,

@Chris_O : Ah. Lubię myśleć o sobie jako o kimś, kto wciąż widzi, czego brakuje w rozwiązaniu, nawet po tym, jak się tego nauczę (tzn. Większość ekspertów nie jest dobrymi nauczycielami i chociaż nie jestem najlepszym ekspertem, ogólnie jestem dobrym nauczycielem. ) OTOH, tęsknię za tym przepraszam. :)
MikeSchinkel

Odpowiedzi:


27

Użyj wp_register_stylei, wp_enqueue_styleaby dodać arkusz stylów. NIE dodawaj po prostu linku do arkusza stylów wp_head. Style kolejkowania pozwalają innym wtyczkom lub motywom modyfikować arkusz stylów, jeśli to konieczne.

Twój arkusz stylów może być plikiem .php:

wp_register_style('myStyleSheet', 'my-stylesheet.php');
wp_enqueue_style( 'myStyleSheet');

my-stylesheet.php wyglądałby tak:

<?php
// We'll be outputting CSS
header('Content-type: text/css');

include('my-plugin-data.php');    
?>

body {
  background: <?php echo $my_background_variable; ?>;
  font-size: <?php echo $my_font_size; ?>;
}

3
Dodatkowo - ponieważ wartości zmieniają się tylko po zmianie wartości na stronie opcji - można zapisać plik CSS podczas zapisywania. Możesz przechowywać pliki CSS również w katalogu wtyczek, więc jest to nieco bardziej wydajne niż uruchamianie pliku PHP na każdym żądaniu CSS z włącznikami itp.
hakre

1
Dzięki! działało dobrze. Ale dostałem błąd krytyczny get_option () ... jest niezdefiniowany. Następnie załadowałem plik wp-config.php, a następnie naprawiłem problem.
Sumith Harshan

Sumith, czy możesz wyjaśnić, w jaki sposób wykorzystałeś opcję get_option w niestandardowym pliku CSS? Wielkie dzięki!
Antonio Petricca,

10

Dynamiczne budowanie pliku CSS, a następnie ładowanie go, OGROMNIE obciąża wydajność, co powinno być bardzo niską przepustowością dodawania pliku CSS, zwłaszcza jeśli w CSS są zmienne, które będą przetwarzane przez WP. Ponieważ są tworzone dwa różne pliki dla jednego ładowania strony, WP uruchamia się dwukrotnie i uruchamia wszystkie zapytania DB dwa razy, i to jest wielki bałagan.

Jeśli suwak ma znajdować się tylko na jednej stronie, a chcesz, aby style były ustawione dynamicznie, najlepszym rozwiązaniem jest dodanie bloku stylu do nagłówka.

W kolejności wykonania:

  1. Dodaj mały blok stylów w nagłówku, dynamicznie tworzony - Bardzo szybko
  2. Dodaj niedynamiczny arkusz stylów przez wp_enqueue_style - Medium
  3. Dodaj dynamiczny arkusz stylów przez wp_enqueue_style - Very Slow

@ Dan-gayle Bardzo dobry punkt. Wtyczki można używać na więcej niż jednej stronie, a niektórzy użytkownicy używają jej na 2 lub 3 stronach. Kolejkuje tylko bieżący statyczny arkusz stylów i js na stronach, które mają krótki kod.
Chris_O,

Zgadzam się z Danem Gayle, mimo że głosowałeś na moją odpowiedź. Dodanie małego bloku CSS do wp_head byłoby znacznie lepsze pod względem wydajności niż wymaganie oddzielnego arkusza stylów do pobrania przy każdym wyświetleniu strony (nawet jeśli jest ograniczony do kilku postów / stron z krótkim kodem). Jedynym powodem, dla którego należy używać osobnych arkuszy stylów, jest to, że mogą być buforowane w przeglądarce . Dynamiczne arkusze stylów nie mogą być buforowane.
Doug

2
Czy to nadal właściwy sposób na załatwienie różnych spraw?
Dave Kiss

2

Tak zazwyczaj to robię:

function build_stylesheet_url() {
    echo '<link rel="stylesheet" href="' . $url . 'stylesheetname.css?build=' . date( "Ymd", strtotime( '-24 days' ) ) . '" type="text/css" media="screen" />';
}

function build_stylesheet_content() {
    if( isset( $_GET['build'] ) && addslashes( $_GET['build'] ) == date( "Ymd", strtotime( '-24 days' ) ) ) {
        header("Content-type: text/css");
        echo "/* Something */";
        define( 'DONOTCACHEPAGE', 1 ); // don't let wp-super-cache cache this page.
        die();
    }
}

add_action( 'init', 'build_stylesheet_content' );
add_action( 'wp_head', 'build_stylesheet_url' );

1

Miałem trudności ze wszystkimi zaleceniami tego rodzaju - może jestem trochę gruby, a może autorzy stracili wspólny charakter.

Postanowiłem zakodować to w pliku php wtyczki: -

echo "<link href='http://www.brittany-gite-holidays.co.uk/wp-content/plugins/flexavailability/css/css.css' type='text/css' rel='stylesheet' />";
echo "<link href='http://www.brittany-gite-holidays.co.uk/wp-content/plugins/flexavailability/css/public.css' rel='stylesheet' type='text/css'/>";

Wydaje się, że działa. Ładuje się tylko na tych stronach, które korzystają z wtyczki. Ładuje się po tagu h1, który jest dla mnie w porządku. Nie widzę, jak mogłoby być bardziej wydajne lub bardziej jasne.

.... ale może się mylę - powiedziałem, że jestem trochę gruby.


<link>Elementy należy ładować tylko w nagłówku strony
shea

Yerss. Wynika to z faktu, że twój css ma wpływ na wszystko od góry strony w dół. Z przyjemnością zmieniam tylko to, co następuje po znaczniku h1. Nie mogłem sprawić, by którykolwiek z przykładów działał (myślę, że mogą być źle wyjaśnione). Spróbuj sam na jakimś teście HTML. Jeśli się mylę, powiedz mi :)
chazza,

@chazza To nie jedyny powód. Gdy przeglądarka wykryje jakiekolwiek style po napisaniu znacznika body, zatrzymuje wszystko, co robi, dopóki ten styl nie zostanie załadowany i zastosowany, co jest niekorzystne z punktu widzenia wydajności i prowadzi do przepełnienia ekranu i błysków niestylizowanego tekstu. Jeśli jednak nie ma to większego znaczenia, wrzuć te pliki css tak, jak powiedziałeś. Robię to cały czas, a pod koniec dnia jest w porządku. Nie optymalne, ale w porządku.
Dan Gayle

0

Aktualizacja od Wordpress 3.3

Istnieje funkcja o nazwie wp_add_inline_style, której można używać do dynamicznego dodawania stylów na podstawie opcji motywu / wtyczki. Można tego użyć do dodania małego pliku css w głowie, który powinien być szybki i wydajny.

<?php
function myprefix_scripts() {

    wp_enqueue_style('name-of-style-css', plugin_dir_path(__FILE__) . '/css/ccsfilename.css');

    $css = get_option( 'loader_css', 'default css goes here for when there is no value' );

    //or for Example
    $color = get_option( 'custom_plugin_color', 'red' ); //red is default value if value is not set
    $css = ".mycolor{
                background: {$color};
           }";

    wp_add_inline_style('name-of-style-css', $css);

}

add_action( 'wp_enqueue_scripts', 'myprefix_scripts' );
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.