如何在样式表中使用WordPress函数?


21

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

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

这不起作用,但是当我这样做时它起作用。

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

有什么问题吗?

这是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');

这实际上是在管理员部分。


如何在style.php中
fuxia

我用wp_enqueue_scripts();
罗尼2012年

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

1
我敢肯定,您不会在自己的中使用它style.php。如果WordPress未调用样式文件,则无法使用WordPress功能。
fuxia

Answers:


26

WordPress功能仅在加载WordPress时可用。如果您style.php直接致电,则无法使用WordPress功能。

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

要到达那里,您必须:

  1. 在注册终结'init'add_rewrite_endpoint()。命名吧'phpstyle'

  2. 挂钩'request'并确保端点变量'phpstyle'(如果已设置)不为空。阅读克里斯托弗·戴维斯 Christopher Davis)出色的WordPress Rewrite API的A(大多数)完整指南,以了解此处的情况。

  3. 挂钩'template_redirect'并传送您的文件,而不是默认的模板文件index.php

为了简短起见,我在下面的演示插件中将所有三个简单步骤组合在一个函数中。

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

安装插件,访问wp-admin/options-permalink.php一次以刷新重写规则,然后style.php在主题中添加一个。

样品 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' );

现在访问yourdomain/phpstyle/。输出:

/* WordPress 3.3.2 */

default

但是如果转到yourdomain/phpstyle/blue/输出是:

/* WordPress 3.3.2 */

blue

因此,您可以使用端点根据的值通过一个文件交付不同的样式表get_query_var( 'phpstyle' )

警告

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


+1,用于将其移植到WP。简短的主意:get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )加快速度……如果可以的话,所有需要的功能都可用……
kaiser 2012年

1

您可以通过通过加载输出来完成此操作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

你不需要../../在上wp-load.php路径,给出的会发现,你作为是功能......但就像我说你需要找到并包括任何文件,你需要有你使用,例如功能。get_background_imagetheme.php等......为您添加到您可能需要更多,所以你需要学习如何找到他们有效和可靠地使用这种方法的CSS。
majick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.