Как я могу использовать функции 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');

Это на самом деле в разделе администратора.

Ronny
источник
Как называется WordPress в style.php?
fuxia
Я использовал wp_enqueue_scripts ();
Ронни
wp_enqueue_style ('my_style', plugin_dir_url ( FILE ) .'Includes / style.php ');
Ронни
1
Я уверен, что вы не используете это в своем style.php. Если файл стиля не вызывается WordPress, функция WordPress недоступна.
Fuxia

Ответы:

26

Функции WordPress доступны только в том случае, если WordPress загружен. Если вы звоните style.phpнапрямую, вы не можете использовать функцию WordPress.

Один простой способ загрузить WordPress для вашей таблицы стилей, управляемой PHP, - это добавить конечную точку в WordPress: пользовательский, зарезервированный URL-адрес, куда вы загружаете файл шаблона.

Чтобы попасть туда, вам нужно:

  1. Зарегистрируйте конечную точку 'init'с помощью add_rewrite_endpoint(). Давайте назовем это 'phpstyle'.

  2. Подключитесь 'request'и убедитесь, что переменная конечной точки 'phpstyle'не пуста, если она установлена. Прочитайте превосходное (в основном) Полное руководство по переписыванию WordPress от Christopher Davis, чтобы понять, что здесь происходит.

  3. Подключитесь 'template_redirect'и доставьте свой файл вместо файла шаблона по умолчанию index.php.

Для краткости я соединил все три простых шага в одной функции в следующем демонстрационном плагине.

Плагин PHP Style

<?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
1

Вы можете сделать это, загрузив выходные данные через admin-ajax.php, но лучший подход к этому - использовать SHORTINITконстанту WordPress, чтобы вы могли загружать только те функции, которые вам нужны, но вам нужно будет найти и загрузить, 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');
majick
источник
При добавлении вашего кода в мои файлы, он по-прежнему говорит неопределенный. Это мой код: pastebin.com/BJaUWX1x
J. Doe
Вам не нужно ../../на wp-load.phpпути к функции , заданной будет найти его для вас , как это ... но , как я сказал , вам нужно найти и включить любые файлы вам нужно , что есть функции , которые вы используете, например. get_background_imageи theme.phpт. д. По мере добавления в CSS вам может понадобиться больше, поэтому вам нужно будет научиться находить их, чтобы использовать этот метод эффективно и надежно.
Маджик