我的style.php文件看起来像这样。

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


这不起作用,但是当我这样做时它就起作用。 />
是什么问题?

这是mainfile.php

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


这实际上在管理部分。

评论

如何在style.php中调用WordPress?

我用了wp_enqueue_scripts();

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

我很确定您不会在style.php中使用它。如果WordPress未调用样式文件,则无法使用WordPress功能。

#1 楼

WordPress功能仅在加载WordPress时可用。如果直接调用style.php,则无法使用WordPress函数。

为PHP驱动的样式表加载WordPress的一种简单方法是向WordPress添加端点:一个自定义的保留URL,用于加载模板文件。

要到达那里,您必须:


'init'上用add_rewrite_endpoint()注册一个端点。我们将其命名为'phpstyle'
插入'request',并确保端点变量'phpstyle'(如果已设置)不为空。阅读克里斯托弗·戴维斯(Christopher Davis)出色的WordPress Rewrite API的A(大多数)完整指南,以了解此处发生的情况。为了简短起见,我在以下演示插件中的一个功能中结合了所有三个简单步骤。

插件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;
}


安装插件,请访问一次'template_redirect'以刷新重写规则,然后在主题中添加一个index.php

示例wp-admin/options-permalink.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' );


现在访问style.php。输出:

/* WordPress 3.3.2 */

default


但是,如果转到style.php,输出为:

/* WordPress 3.3.2 */

blue


所以可以使用终结点,以根据yourdomain/phpstyle/的值提供带有一个文件的不同样式表。

Caveat

这将减慢您的网站速度。每次访问WordPress必须加载两次。没有积极的缓存就不要这样做。

评论


+1以便将此移植到WP。简短的想法:get_query_var('phpstyle')AND! define('SHORTINIT')和define('SHORTINIT',true)可以加快速度...如果可以的话,所有需要的功能都可用...

– kaiser
2012-12-12 14:33



#2 楼

您可以通过admin-ajax.php加载输出来完成此操作,但是更好的方法是使用WordPress SHORTINIT常量,这样就可以加载所需的功能,但是您需要查找并加载wp-load.php才能执行此操作:

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


此时,您需要确保包含获取主题选项所需的其他wp-includes文件-具体取决于您保存和访问这些文件的方式。 (您可能需要在此列表中添加更多内容,以免出现致命错误-但是在您执行操作时,致命错误将告诉您需要添加哪些文件。)

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


然后,一旦您拥有所有需要的功能,就可以使用这些功能输出CSS。例如。

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


然后您可以按正常顺序将文件放入队列,例如:

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


评论


将代码添加到我的文件时,它仍然显示未定义。这是我的代码:pastebin.com/BJaUWX1x

– J. Doe
16年3月3日在12:18

您不需要wp-load.php路径上的../../,给出的函数将按原样为您找到...但是就像我说的那样,您确实需要查找并包含所需的任何文件具有您正在使用的功能,例如。 get_background_image在theme.php等文件中……当您添加到CSS时,可能需要更多,因此您将需要学习如何找到它们以有效,可靠地使用此方法。

– majick
16年4月4日在1:08