Làm cách nào để thêm tùy chọn CSS vào plugin mà không sử dụng kiểu nội tuyến?


26

Gần đây tôi đã phát hành một plugin, WP Coda Slider , sử dụng mã ngắn để thêm thanh trượt jQuery vào bất kỳ bài đăng hoặc trang nào. Tôi đang thêm một trang tùy chọn trong phiên bản tiếp theo và tôi muốn bao gồm một số tùy chọn CSS nhưng tôi không muốn plugin thêm các lựa chọn kiểu như CSS nội tuyến. Tôi muốn các lựa chọn được tự động thêm vào tệp CSS khi nó được gọi.

Tôi cũng muốn tránh sử dụng fopen hoặc ghi vào một tệp cho các vấn đề bảo mật.

Là một cái gì đó như thế này dễ thực hiện hay tôi sẽ tốt hơn nếu chỉ thêm các lựa chọn kiểu trực tiếp vào trang?


@Chris_O : Tôi đã suy nghĩ về gần như chính xác điều tương tự. Điều tôi muốn là một cách gọi wp_enqueue_style()(và wp_enqueue_script()) bằng tên hàm thay vì tên tệp và để chức năng của tôi tạo CSS (hoặc JS) nhưng cuối cùng vẫn được đưa vào thông qua biểu định kiểu được liên kết. Theo như tôi biết thì điều này là không thể với các wp_equeue_*()chức năng. Có lẽ chúng ta nên nộp một vé trac?
MikeSchinkel

@MikeSchinkel: Đó sẽ là một cách rất hợp lý để sử dụng các hàm wp_enqueue. Tôi sẽ thêm hỗ trợ cho vé đó.
Chris_O

@Chris_O: Tôi vừa thấy câu trả lời của @ Doug; Tôi đã đưa ra một giả định xấu mà bạn đã biết điều đó. Nếu tôi nhận ra rằng đó không phải là trường hợp tôi sẽ chỉ cho bạn ở đây: wordpress.stackexchange.com/questions/556/#562
MikeSchinkel

@MikeSchinkel Tôi biết về wp_register và wp_enqueue. Tôi đang tìm cách xây dựng biểu định kiểu dựa trên các giá trị từ trang tùy chọn plugin.
Chris_O

@Chris_O : À. Tôi thích nghĩ về bản thân mình như một người vẫn có thể nhìn thấy những gì người khác đang thiếu trong một giải pháp ngay cả sau khi tôi học giải pháp (tức là hầu hết các chuyên gia không phải là giáo viên giỏi và mặc dù tôi không phải là chuyên gia giỏi nhất. ) OTOH, đây là một cái mà tôi đã bỏ lỡ, xin lỗi. :)
MikeSchinkel

Câu trả lời:


27

Sử dụng wp_register_stylewp_enqueue_styleđể thêm biểu định kiểu. KHÔNG chỉ cần thêm một liên kết biểu định kiểu vào wp_head. Kiểu xếp hàng cho phép các plugin hoặc chủ đề khác sửa đổi biểu định kiểu nếu cần.

Biểu định kiểu của bạn có thể là tệp .php:

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

my-Stylesheet.php sẽ như thế này:

<?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
Ngoài ra - vì các giá trị chỉ thay đổi khi các giá trị trên trang tùy chọn bị thay đổi - bạn có thể tạo tệp CSS khi lưu. Bạn cũng có thể lưu trữ các tệp CSS trong thư mục plugin, vì vậy đây là một phần mềm hiệu quả hơn sau đó để chạy một tệp PHP trên mỗi yêu cầu CSS kèm theo, v.v.
hakre

1
Cảm ơn! làm việc tốt. Nhưng tôi đã nhận được lỗi nghiêm trọng get_option () ... không xác định. Sau đó, tôi đã tải tệp wp-config.php và sau đó khắc phục sự cố.
Sumith Harshan

Sumith, bạn có thể khám phá cách bạn đã sử dụng get_option bên trong tệp CSS tùy chỉnh không? Cảm ơn nhiều!
Antonio Petricca

10

Tự động xây dựng một tệp CSS và sau đó tải nó thêm gánh nặng hiệu năng HUGE cho một thỏa thuận băng thông rất thấp khi thêm tệp CSS, đặc biệt là nếu có các biến trong CSS sẽ được xử lý thông qua WP. Vì đó là hai tệp khác nhau được tạo cho một lần tải trang, WP khởi động hai lần và chạy tất cả các truy vấn DB hai lần và đó là một mớ hỗn độn lớn.

Nếu thanh trượt của bạn chỉ xuất hiện trên một trang và bạn muốn các kiểu được đặt tự động, thì cách tốt nhất của bạn là thêm một khối kiểu vào tiêu đề.

Theo thứ tự thực hiện:

  1. Thêm một khối nhỏ các kiểu trong tiêu đề, được tạo động - Rất nhanh
  2. Thêm biểu định kiểu không động qua wp_enqueue_style - Trung bình
  3. Thêm biểu định kiểu động qua wp_enqueue_style - Rất chậm

@ Dan-gayle Điểm rất tốt. Plugin có thể được sử dụng trên nhiều trang và một số người dùng đang sử dụng nó trên 2 hoặc 3 trang. Nó chỉ ghi lại biểu định kiểu tĩnh hiện tại và js trên các trang có mã ngắn.
Chris_O

Tôi đồng ý với Dan Gayle, mặc dù bạn đã bỏ phiếu cho câu trả lời của tôi. Thêm một khối CSS nhỏ vào wp_head sẽ có hiệu suất tốt hơn nhiều so với yêu cầu một biểu định kiểu riêng biệt được tải xuống trên mỗi chế độ xem trang (ngay cả khi bị giới hạn trong một vài bài đăng / trang có mã ngắn). Lý do duy nhất để sử dụng các bảng định kiểu riêng biệt ở vị trí đầu tiên là chúng có thể được lưu trữ bởi trình duyệt . Các bảng định kiểu động không thể được lưu trữ.
Doug

2
Đây vẫn là cách đúng đắn để đi về mọi thứ?
Dave Kiss

2

Đây là cách tôi thường làm:

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

Tôi đã gặp khó khăn với tất cả các khuyến nghị của ilk này - có thể tôi hơi dày, hoặc có thể những người đóng góp đã mất liên lạc chung.

Tôi đã giải quyết việc mã hóa này trong tệp php của trình cắm thêm: -

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

Nó dường như làm việc. Nó chỉ tải trên các trang sử dụng plugin. Nó tải sau thẻ h1 là tốt đối với tôi. Tôi không thể thấy làm thế nào nó có thể hiệu quả hơn hoặc rõ ràng hơn.

.... nhưng có lẽ tôi đã sai - tôi đã nói rằng tôi hơi dày.


Bạn chỉ nên tải <link>các phần tử trong phần đầu trang
shea

Đúng Đó là vì css của bạn muốn ảnh hưởng đến mọi thứ từ đầu trang trở xuống. Tôi rất vui khi chỉ ảnh hưởng đến những gì xuất hiện sau thẻ h1. Tôi không thể làm cho bất kỳ ví dụ nào hoạt động (tôi nghĩ rằng chúng có thể được giải thích tồi tệ). Hãy tự thử nó trên một số đoạn thử nghiệm html. Nếu tôi sai hãy nói với tôi :)
chazza

@chazza Đó không phải là lý do duy nhất. Khi trình duyệt phát hiện bất kỳ kiểu nào sau khi thẻ body được viết, nó sẽ dừng mọi hoạt động khác cho đến khi kiểu đó được tải và áp dụng, điều này không tốt cho hiệu suất và dẫn đến phản xạ màn hình và nhấp nháy văn bản không được chỉnh sửa. Tuy nhiên, nếu nó không thực sự quan trọng, hãy ném các tệp css đó vào như bạn đã nói. Tôi làm điều đó mọi lúc, và vào cuối ngày thì ổn. Không tối ưu, nhưng tốt.
Dan Gayle

0

Cập nhật kể từ Wordpress 3.3

Có một chức năng gọi là wp_add_inline_style có thể được sử dụng để tự động thêm kiểu dựa trên các tùy chọn chủ đề / plugin. Điều này có thể được sử dụng để thêm một tập tin css nhỏ vào đầu nên nhanh chóng và hiệu quả.

<?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' );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.