ฉันจะเพิ่มตัวเลือก CSS ในปลั๊กอินของฉันโดยไม่ใช้สไตล์อินไลน์ได้อย่างไร


26

ฉันเพิ่งเปิดตัวปลั๊กอินWP Coda Sliderที่ใช้รหัสย่อเพื่อเพิ่มตัวเลื่อน jQuery ในโพสต์หรือหน้าใด ๆ ฉันกำลังเพิ่มหน้าตัวเลือกในรุ่นถัดไปและฉันต้องการที่จะรวมบางตัวเลือก CSS แต่ฉันไม่ต้องการให้ปลั๊กอินเพื่อเพิ่มตัวเลือกสไตล์เป็นแบบอินไลน์ CSS ฉันต้องการเพิ่มตัวเลือกในไฟล์ CSS แบบไดนามิกเมื่อเรียกใช้

ฉันต้องการหลีกเลี่ยงการใช้ fopen หรือเขียนลงไฟล์สำหรับปัญหาด้านความปลอดภัย

เป็นเช่นนี้ง่ายต่อการบรรลุหรือฉันจะดีกว่าเพียงแค่เพิ่มตัวเลือกสไตล์โดยตรงกับหน้า?


@Chris_O : ฉันกำลังคิดเกี่ยวกับสิ่งเดียวกันเกือบทั้งหมด สิ่งที่ฉันต้องการคือวิธีการโทรwp_enqueue_style()(และ wp_enqueue_script()) ด้วยชื่อฟังก์ชั่นแทนชื่อไฟล์และให้ฟังก์ชั่นของฉันสร้าง CSS (หรือ JS) แต่ยังคงมีอยู่ในที่สุดผ่านทางสไตล์ชีทที่เชื่อมโยง เท่าที่ฉันรู้ว่ามันเป็นไปไม่ได้กับwp_equeue_*()ฟังก์ชั่น บางทีเราควรส่งตั๋ว trac?
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 : อา ฉันชอบคิดว่าตัวเองเป็นคนที่ยังสามารถเห็นสิ่งที่คนอื่นหลงทางในการแก้ปัญหาแม้หลังจากที่ฉันเรียนรู้วิธีแก้ปัญหา (เช่นผู้เชี่ยวชาญส่วนใหญ่ไม่ใช่ครูที่ดีและแม้ว่าฉันไม่ใช่ผู้เชี่ยวชาญที่ดีที่สุด ) OTOH นี่คือสิ่งที่ฉันพลาดขอโทษ :)
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 แต่ละรายการที่มีการรวมไว้ด้วย
hakre

1
ขอบคุณ! ทำงานได้ดี แต่ฉันได้รับข้อผิดพลาดร้ายแรง get_option () ... ไม่ได้กำหนด จากนั้นฉันโหลดไฟล์ wp-config.php แล้วแก้ไขปัญหา
Sumith Harshan

สรุปคุณช่วยอธิบายว่าคุณใช้ get_option ในไฟล์ CSS ที่กำหนดเองได้อย่างไร ขอบคุณมาก!
Antonio Petricca

10

การสร้างไฟล์ CSS แบบไดนามิกและจากนั้นการโหลดมันจะเพิ่มภาระประสิทธิภาพการทำงานขนาดใหญ่ให้กับสิ่งที่ควรจะเป็นข้อตกลงแบนด์วิดท์ที่ต่ำมากในการเพิ่มไฟล์ CSS โดยเฉพาะอย่างยิ่งหากมีตัวแปรใน CSS ที่จะประมวลผลผ่าน WP เนื่องจากมันเป็นไฟล์ที่แตกต่างกันสองไฟล์ที่ถูกสร้างขึ้นสำหรับการโหลดหนึ่งหน้า WP เริ่มต้นขึ้นสองครั้งและรันการสืบค้น DB ทั้งหมดสองครั้งและเป็นระเบียบขนาดใหญ่

หากแถบเลื่อนของคุณจะอยู่ในหน้าเดียวเท่านั้นและคุณต้องการให้สไตล์มีการตั้งค่าแบบไดนามิกดังนั้นทางออกที่ดีที่สุดของคุณคือการเพิ่มบล็อกสไตล์ไว้ที่ส่วนหัว

ตามลำดับของประสิทธิภาพ:

  1. เพิ่มบล็อกเล็ก ๆ ของสไตล์ในส่วนหัวสร้างแบบไดนามิก - เร็วมาก
  2. เพิ่มสไตล์ชีทที่ไม่ใช่ไดนามิกผ่าน wp_enqueue_style - Medium
  3. เพิ่มสไตล์ชีทแบบไดนามิกผ่าน wp_enqueue_style - ช้ามาก

@ Dan-gayle จุดดีมาก ปลั๊กอินสามารถใช้งานได้มากกว่าหนึ่งหน้าและผู้ใช้บางคนกำลังใช้งานบนหน้า 2 หรือ 3 หน้า มันจัดคิวเฉพาะสไตล์ชีตคงที่ในปัจจุบันและ js บนหน้าเว็บที่มีรหัสย่อ
Chris_O

ฉันเห็นด้วยกับ Dan Gayle แม้ว่าคุณจะตอบคำถามของฉันก็ตาม การเพิ่มบล็อก CSS ขนาดเล็กลงใน wp_head จะดีกว่าประสิทธิภาพมากกว่าการดาวน์โหลดสไตล์ชีทที่แยกต่างหากในทุกการดูหน้าเว็บ เหตุผลเดียวที่ใช้สไตล์ชีทแยกกันในตอนแรกคือเบราว์เซอร์สามารถแคชได้ สไตล์แคชแบบไดนามิกไม่สามารถแคชได้
Doug

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>องค์ประกอบในส่วนหัวของหน้าเท่านั้น
shea

Yerss นั่นอาจเป็นเพราะ css ของคุณต้องการส่งผลกระทบต่อทุกสิ่งจากด้านบนของหน้าลง ฉันยินดีที่จะส่งผลต่อเฉพาะสิ่งที่เกิดขึ้นหลังจากแท็ก h1 ฉันไม่สามารถทำให้ตัวอย่างใด ๆ ใช้งานได้ (ฉันคิดว่าพวกเขาอาจอธิบายได้ไม่ดี) ลองทดสอบด้วยตัวเองในบางส่วนของ html หากฉันผิดบอกฉัน :)
chazza

@chazza นั่นไม่ใช่เหตุผลเดียว เมื่อเบราว์เซอร์ตรวจพบสไตล์ใด ๆ หลังจากเขียนแท็กเนื้อหามันจะหยุดสิ่งอื่นที่กำลังทำอยู่จนกว่าจะมีการโหลดและใช้สไตล์นั้นซึ่งไม่ดีต่อประสิทธิภาพและนำไปสู่หน้าจอที่ปรับเปลี่ยนและกะพริบข้อความที่ไม่มีสไตล์ อย่างไรก็ตามหากมันไม่สำคัญให้ทิ้งไฟล์ 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' );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.