Làm cách nào tôi có thể sử dụng các chức năng WordPress trong biểu định kiểu của mình?


21

Tôi có style.phptập tin của tôi trông như thế này.

<?php  header('Content-Type: text/css');?>
#div{
    background:<?php  echo get_option('bgcolor');?>;
}

Điều này không hoạt động, nhưng khi tôi làm điều này nó hoạt động.

<?php  header('Content-Type: text/css');?>
#div{
    background: <?php  echo 'blue';?>;
}

Vấn đề sẽ là gì?

Đây là tệp tin mainfile.php

 <?php 

    function test(){
    global get_option('bgcolor');?>

        <input type="text" id="bgcolor" name="post_popup_settings[bgcolor]" value="<?php echo get_option('bgcolor');?> " />
    <?php
}
    add_action('admin_head','test');

Điều này thực sự là trong phần quản trị.


WordPress được gọi như thế nào trong style.php?
fuxia

Tôi đã sử dụng wp_enqueue_scripts ();
Ronny

wp_enqueue_style ('my_style', plugin_dir_url ( FILE ) .'Includes / style.php ');
Ronny

1
Tôi khá chắc chắn rằng bạn không sử dụng nó trong của bạn style.php. Nếu tệp kiểu không được gọi bởi WordPress thì không có chức năng WordPress nào khả dụng.
fuxia

Câu trả lời:


26

Các chức năng WordPress chỉ khả dụng nếu WordPress được tải. Nếu bạn gọi style.phptrực tiếp, bạn không thể sử dụng chức năng WordPress.

Một cách đơn giản để tải WordPress cho biểu định kiểu do PHP điều khiển của bạn là thêm điểm cuối vào WordPress: URL tùy chỉnh, dành riêng nơi bạn tải tệp mẫu của mình.

Để đến đó bạn phải:

  1. Đăng ký một điểm cuối 'init'với add_rewrite_endpoint(). Hãy đặt tên cho nó 'phpstyle'.

  2. Nối vào 'request'và đảm bảo biến điểm cuối 'phpstyle'không trống nếu được đặt. Đọc Hướng dẫn hoàn chỉnh A (Chủ yếu) xuất sắc của Christopher Davis về API Viết lại WordPress để hiểu những gì đang diễn ra ở đây.

  3. Nối vào 'template_redirect'và phân phối tệp của bạn thay vì tệp mẫu mặc định index.php.

Để giữ mọi thứ ngắn gọn, tôi đã kết hợp cả ba bước đơn giản trong một chức năng trong plugin demo sau.

Plugin kiểu PHP

<?php # -*- coding: utf-8 -*-
/*
 * Plugin Name: PHP Style
 * Description: Make your theme's 'style.php' available at '/phpstyle/'.
 */
add_action( 'init',              'wpse_54583_php_style' );
add_action( 'template_redirect', 'wpse_54583_php_style' );
add_filter( 'request',           'wpse_54583_php_style' );

function wpse_54583_php_style( $vars = '' )
{
    $hook = current_filter();

    // load 'style.php' from the current theme.
    'template_redirect' === $hook
        && get_query_var( 'phpstyle' )
        && locate_template( 'style.php', TRUE, TRUE )
        && exit;

    // Add a rewrite rule.
    'init' === $hook && add_rewrite_endpoint( 'phpstyle', EP_ROOT );

    // Make sure the variable is not empty.
    'request' === $hook
        && isset ( $vars['phpstyle'] )
        && empty ( $vars['phpstyle'] )
        && $vars['phpstyle'] = 'default';

    return $vars;
}

Cài đặt plugin, truy cập wp-admin/options-permalink.php một lần để làm mới các quy tắc viết lại và thêm một style.phpchủ đề của bạn.

Mẫu vật style.php

<?php # -*- coding: utf-8 -*-
header('Content-Type: text/css;charset=utf-8');

print '/* WordPress ' . $GLOBALS['wp_version'] . " */\n\n";

print get_query_var( 'phpstyle' );

Bây giờ hãy truy cập yourdomain/phpstyle/. Đầu ra:

/* WordPress 3.3.2 */

default

Nhưng nếu bạn đi đến yourdomain/phpstyle/blue/đầu ra là:

/* WordPress 3.3.2 */

blue

Vì vậy, bạn có thể sử dụng điểm cuối để phân phối các bảng định kiểu khác nhau với một tệp tùy thuộc vào giá trị của get_query_var( 'phpstyle' ) .

Hãy cẩn thận

Điều này sẽ làm chậm trang web của bạn. WordPress phải được tải hai lần cho mỗi lần truy cập. Đừng làm điều đó mà không tích cực lưu trữ.


+1 để chuyển cái này sang WP. Ý tưởng ngắn: get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )để tăng tốc mọi thứ ... và nếu sau đó tất cả các chức năng cần thiết đều khả dụng ...
kaiser

1

Bạn có thể làm điều này bằng cách tải đầu ra qua admin-ajax.php, nhưng cách tiếp cận tốt hơn là sử dụng SHORTINIThằng số WordPress để bạn có thể tải những chức năng bạn cần, nhưng bạn sẽ cần tìm và tải wp-load.phpđể làm điều này:

// send CSS Header
header("Content-type: text/css; charset: UTF-8");

// faster load by reducing memory with SHORTINIT
define('SHORTINIT', true);

// recursively find WordPress load
function find_require($file,$folder=null) {
    if ($folder === null) {$folder = dirname(__FILE__);}
    $path = $folder.DIRECTORY_SEPARATOR.$file;
    if (file_exists($path)) {require($path); return $folder;}
    else {
        $upfolder = find_require($file,dirname($folder));
        if ($upfolder != '') {return $upfolder;}
    }
}

// load WordPress core (minimal)
$wp_root_path = find_require('wp-load.php');
define('ABSPATH', $wp_root_path);
define('WPINC', 'wp-includes');

Tại thời điểm này, bạn sẽ cần chắc chắn bao gồm bất kỳ wp-includestệp nào khác bạn cần để có các tùy chọn chủ đề của mình - sẽ thay đổi tùy thuộc vào cách bạn đang lưu và do đó truy cập vào các tệp đó. (Bạn có thể sẽ cần thêm nhiều hơn vào danh sách này để không gặp phải lỗi nghiêm trọng - nhưng khi bạn đang đi, các lỗi nghiêm trọng sẽ cho bạn biết bạn cần thêm tệp nào.) Ví dụ:

include(ABSPATH.WPINC.DIRECTORY_SEPARATOR.'version.php');
include(ABSPATH.WPINC.DIRECTORY_SEPARATOR.'general-template.php');
include(ABSPATH.WPINC.DIRECTORY_SEPARATOR.'link-template.php');

Sau đó, khi bạn có tất cả các chức năng bạn cần, bạn có thể xuất CSS bằng các chức năng đó ... vd.

echo 'body {color:' . get_theme_mod('body_color') . ';}';
echo 'body {backgroundcolor:' . get_theme_mod('body_background_color') . ';}';
exit;

Sau đó, bạn có thể liệt kê tệp như bình thường, ví dụ:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');

Khi thêm mã của bạn vào tập tin của tôi, nó vẫn không xác định. Đây là mã của tôi: pastebin.com/BJaUWX1x
J. Doe

bạn không cần ../../trên wp-load.phpcon đường, chức năng nhất định sẽ tìm thấy nó cho bạn như là ... nhưng như tôi đã nói bạn làm cần phải tìm và bao gồm bất cứ tập tin bạn cần có các chức năng bạn đang sử dụng, ví dụ. get_background_imagelà trong theme.phpv.v ... khi bạn thêm vào CSS, bạn có thể cần nhiều hơn vì vậy bạn sẽ cần học cách tìm ra chúng để sử dụng phương pháp này một cách hiệu quả và đáng tin cậy.
Majick
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.