¿Cómo agrego opciones CSS a mi complemento sin usar estilos en línea?

26

Recientemente lancé un complemento, WP Coda Slider , que utiliza códigos cortos para agregar un control deslizante jQuery a cualquier publicación o página. Estoy agregando una página de opciones en la próxima versión y me gustaría incluir algunas opciones de CSS, pero no quiero que el complemento agregue las opciones de estilo como CSS en línea. Quiero que las opciones se agreguen dinámicamente al archivo CSS cuando se llama.

También me gustaría evitar usar fopen o escribir en un archivo por problemas de seguridad.

¿Es algo así de fácil de lograr o sería mejor agregar las opciones de estilo directamente a la página?

Chris_O
fuente
@ Chris_O : He estado pensando en casi exactamente lo mismo. Lo que quiero es una forma de llamar wp_enqueue_style()(y wp_enqueue_script()) con un nombre de función en lugar de un nombre de archivo y hacer que mi función genere el CSS (o JS) pero que finalmente lo incluya a través de una hoja de estilo vinculada. Hasta donde sé, esto no es posible con las wp_equeue_*()funciones. ¿Quizás deberíamos enviar un ticket de trac?
MikeSchinkel
@MikeSchinkel: Esa sería una forma muy lógica de usar las funciones wp_enqueue. Yo agregaría soporte a ese boleto.
Chris_O
@ Chris_O: Acabo de ver la respuesta de @ Doug; Supuse que ya lo sabías. Si me hubiera dado cuenta de que ese no era el caso, te habría señalado aquí: wordpress.stackexchange.com/questions/556/#562
MikeSchinkel
@ MikeSchinkel Sabía sobre wp_register y wp_enqueue. Estaba buscando una manera de construir la hoja de estilo basada en los valores de la página de opciones del complemento.
Chris_O
@ Chris_O : Ah. Me gusta pensar en mí mismo como alguien que todavía puede ver lo que a otros les falta en una solución incluso después de haber aprendido la solución (es decir, la mayoría de los expertos no son buenos maestros y, aunque no soy el mejor experto, generalmente soy un buen maestro). ) OTOH, este es uno que me perdí, lo siento. :)
MikeSchinkel

Respuestas:

27

Use wp_register_styley wp_enqueue_stylepara agregar la hoja de estilo. NO agregue simplemente un enlace de hoja de estilo wp_head. Los estilos de espera permiten que otros complementos o temas modifiquen la hoja de estilos si es necesario.

Su hoja de estilo puede ser un archivo .php:

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

my-stylesheet.php se vería así:

<?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; ?>;
}
Doug
fuente
3
Además, como los valores solo cambian cuando se cambian los valores de la página de opciones, puede generar el archivo CSS al guardar. También puede almacenar archivos CSS en el directorio de complementos, por lo que es un poco más eficiente que ejecutar un archivo PHP en cada solicitud CSS con incluye, etc.
Hakre
1
¡Gracias! funcionado bien. Pero obtuve el error fatal get_option () ... no está definido. Luego cargué el archivo wp-config.php y luego solucioné el problema.
Sumith Harshan
En resumen, ¿podría explicar cómo ha utilizado get_option dentro del archivo CSS personalizado? ¡Muchas gracias!
Antonio Petricca
10

Construir dinámicamente un archivo CSS y luego cargarlo agrega una enorme carga de rendimiento a lo que debería ser un acuerdo de ancho de banda muy bajo de agregar un archivo CSS, especialmente si hay variables en el CSS que se procesarán a través de WP. Debido a que se están creando dos archivos diferentes para una carga de página, WP se inicia dos veces y ejecuta todas las consultas de DB dos veces, y es un gran desastre.

Si su control deslizante solo va a estar en una página, y desea que los estilos se configuren dinámicamente, entonces su mejor opción es agregar un bloque de estilo al encabezado.

En orden de desempeño:

  1. Agregue un pequeño bloque de estilos en el encabezado, creado dinámicamente - Muy rápido
  2. Agregue una hoja de estilo no dinámica a través de wp_enqueue_style - Medium
  3. Agregue una hoja de estilo dinámica a través de wp_enqueue_style - Muy lenta
Dan Gayle
fuente
@ Dan-gayle Muy buen punto. El complemento se puede usar en más de una página y algunos usuarios lo están usando en 2 o 3 páginas. Solo pone en cola la hoja de estilo estática actual y js en las páginas que tienen el shortcode.
Chris_O
Estoy de acuerdo con Dan Gayle, a pesar de que votaste mi respuesta. Agregar un pequeño bloque CSS a wp_head sería mucho mejor en términos de rendimiento que requerir que se descargue una hoja de estilo por separado en cada vista de página (incluso si se restringe a las pocas publicaciones / páginas con el shortcode). La única razón para usar hojas de estilo separadas en primer lugar es que el navegador las puede almacenar en caché . Las hojas de estilo dinámicas no se pueden almacenar en caché.
Doug
2
¿Sigue siendo la forma correcta de hacer las cosas?
Dave Kiss
2

Así es como lo hago habitualmente:

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' );
sorich87
fuente
1

He tenido dificultades con todas las recomendaciones de este tipo: tal vez soy un poco grueso, o tal vez los contribuyentes han perdido el toque común.

Me decidí a codificar esto en el archivo php del complemento:

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

Parece funcionar. Solo se carga en aquellas páginas que usan el complemento. Se carga después de la etiqueta h1 que está bien para mí. No puedo ver cómo podría ser más eficiente o más claro.

.... pero tal vez me equivoque, dije que era un poco gruesa.

chazza
fuente
Solo debe cargar <link>elementos en el encabezado de la página
shea
Yerss Eso sería porque se quiere que su CSS afecte a todo, desde la parte superior de la página hacia abajo. Estoy feliz de afectar solo lo que viene después de la etiqueta h1. No pude hacer que ninguno de los ejemplos funcionara (creo que pueden estar mal explicados). Pruébelo usted mismo en alguna pieza de prueba html. Si me equivoco dímelo :)
chazza
@chazza Esa no es la única razón. Cuando un navegador detecta cualquier estilo después de que se escribe la etiqueta del cuerpo, detiene todo lo que está haciendo hasta que se carga y aplica ese estilo, lo que es malo para el rendimiento y conduce a reflujos de pantalla y destellos de texto sin estilo. Sin embargo, si realmente no importa, arroje esos archivos CSS como usted dijo. Lo hago todo el tiempo, y al final del día está bien. No es óptimo, pero está bien.
Dan Gayle
0

Actualización desde Wordpress 3.3

Hay una función llamada wp_add_inline_style que se puede usar para agregar estilos dinámicamente en función de las opciones de tema / complemento. Esto se puede usar para agregar un pequeño archivo css en la cabeza que debería ser rápido y eficiente.

<?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' );
Lyle Bennett
fuente