Як додати параметри CSS до свого плагіна без використання вбудованих стилів?


26

Нещодавно я випустив плагін WP Coda Slider , який використовує короткі коди, щоб додати повзунок jQuery до будь-якої публікації чи сторінки. Я додаю сторінку параметрів у наступній версії, і я хотів би включити деякі параметри CSS, але я не хочу, щоб плагін додавав вибір стилів як вбудований CSS. Я хочу, щоб вибір був динамічно доданий у файл CSS, коли він викликається.

Я також хотів би уникати використання fopen або запису у файл для проблем безпеки.

Чи щось подібне легко здійснити чи мені краще буде просто додати вибір стилю безпосередньо на сторінку?


@Chris_O : Я думав про майже те саме. Мені хочеться - це спосіб викликати wp_enqueue_style()wp_enqueue_script()) ім'я функції замість імені файлу, і моя функція генерує CSS (або JS), але все-таки включати його в кінцевому рахунку через пов'язаний таблицю стилів. Наскільки я знаю, це неможливо з wp_equeue_*()функціями. Можливо, нам слід подати квиток на проїзд?
MikeSchinkel

@MikeSchinkel: Це був би дуже логічний спосіб використання функцій wp_enqueue. Я б додав підтримку до цього квитка.
Chris_O

@Chris_O: Я щойно побачив відповідь @ Doug; Я погано припускав, що ви це вже знали. Якби я зрозумів, що це не так, я би вказав на вас тут: wordpress.stackexchange.com/questions/556/#562
MikeSchinkel

@MikeSchinkel Я знав про wp_register та wp_enqueue. Я шукав спосіб побудувати таблицю стилів на основі значень на сторінці параметрів плагіна.
Chris_O

@Chris_O : Ага. Мені подобається думати про себе як про когось, хто все ще може побачити те, чого не вистачає в рішенні навіть після того, як я дізнаюся рішення (тобто більшість експертів не є хорошими вчителями, і хоча я не найкращий експерт, я, як правило, хороший викладач. ) ОТО, це я пропустив, вибачте. :)
MikeSchinkel

Відповіді:


27

Використовуйте wp_register_styleта wp_enqueue_styleдодайте таблицю стилів. НЕ просто додайте посилання на таблицю стилів wp_head. Стилі черги дозволяють іншим плагінам або темам змінювати таблицю стилів, якщо це необхідно.

Ваш таблиця стилів може бути .php файлом:

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

my-stylesheet.php виглядатиме так:

<?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
Крім того - оскільки значення змінюються лише при зміні значень на сторінці опцій, ви можете створити файл CSS при збереженні. Ви також можете зберігати файли CSS у каталозі плагінів, тому це трохи ефективніше, ніж запускати файл PHP на кожен запит CSS з включенням тощо.
хакре

1
Спасибі! добре працювали. Але я отримав фатальну помилку get_option () ... не визначено. Потім я завантажив файл wp-config.php і потім виправив проблему.
Суміт Харшан

Суміт, ви могли б пояснити, як ви використовували get_option всередині спеціального файлу CSS? Велике дякую!
Антоніо Петріка

10

Динамічне складання CSS-файлу та завантаження його додає великого навантаження на ефективність до того, що має бути дуже низькою пропускною здатністю додавання CSS-файлу, особливо якщо в CSS є змінні, які підлягають обробці через WP. Оскільки це два різні файли, створені для завантаження однієї сторінки, WP запускається двічі і запускає всі запити БД двічі, і це велика безлад.

Якщо ваш слайдер буде розміщений лише на одній сторінці, і ви хочете, щоб стилі були задані динамічно, то найкраще поставити блок заголовка стилю до заголовка.

У порядку виконання:

  1. Додайте невеликий блок стилів у заголовок, динамічно створений - Дуже швидко
  2. Додайте нединамічний таблицю стилів через wp_enqueue_style - Середній
  3. Додайте динамічну таблицю стилів через wp_enqueue_style - Дуже повільно

@ Dan-gayle Дуже хороший момент. Плагін можна використовувати на більш ніж одній сторінці, а деякі користувачі використовують його на 2 або 3 сторінках. Він запускає лише поточний аркуш статичного стилю та js на сторінках із коротким кодом.
Chris_O

Я погоджуюся з Деном Гейлем, навіть якщо ви проголосували за мою відповідь. Додавання невеликого блоку CSS до wp_head було б набагато кращим для продуктивності, ніж вимагати завантаження окремого таблиці стилів на кожному перегляді сторінки (навіть якщо це обмежено кількома публікаціями / сторінками з коротким кодом). Єдиною причиною використання окремих таблиць стилів в першу чергу є те, що вони можуть кешуватися браузером . Динамічні таблиці стилів не можна кешувати.
Дуг

2
Це все-таки правильний шлях для речей?
Dave Kiss

2

Ось як це я зазвичай роблю:

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

У мене виникли труднощі з усіма рекомендаціями цієї лайки - можливо, я дещо товстий, а може співавтори втратили загальну справу.

Я зупинився на кодуванні цього в PHP-плагіні:

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

Здається, працює. Він завантажується лише на ті сторінки, які використовують плагін. Він завантажується після тегу h1, який я добре чую. Я не бачу, як це може бути ефективніше чи зрозуміліше.

.... але, можливо, я помиляюся - я сказав, що я трохи товстий.


Ви повинні завантажувати лише <link>елементи в голову сторінки
she

Yerss. Це було б тому, що ваш css хоче впливати на все, починаючи з верху сторінки вниз. Я радий впливати лише на те, що з’являється після тегу h1. Я не міг зробити так, щоб жоден із прикладів працював (я думаю, що вони можуть бути погано пояснені). Спробуйте це для себе на якомусь тесті html. Якщо я помиляюся, скажіть мені :)
chazza

@chazza Це не єдина причина. Коли браузер виявляє будь-які стилі після написання тегу body, він зупиняє все, що він робить, поки цей стиль не завантажується та не застосовується, що погано спрацьовує та призводить до поповнення екрана та спалахів невтішного тексту. Однак якщо це насправді не має значення, киньте ці файли css так, як ви сказали. Я роблю це постійно, і наприкінці дня це добре. Не оптимально, але добре.
Dan Gayle

0

Оновлення після Wordpress 3.3

Існує функція під назвою wp_add_inline_style, яку можна використовувати для динамічного додавання стилів на основі параметрів теми / плагіна. Це можна використовувати для додавання невеликого файлу css у голові, який повинен бути швидким та ефективним.

<?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' );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.