Como posso usar as funções do WordPress na minha folha de estilo?

21

Eu tenho meu style.phparquivo assim.

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

Isso não funciona, mas quando faço isso, funciona.

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

Qual seria o problema?

Este é o 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');

Na verdade, isso está na seção de administração.

Ronny
fonte
Como o WordPress é chamado em style.php?
fuxia
Eu usei wp_enqueue_scripts ();
Ronny
wp_enqueue_style ('my_style', plugin_dir_url ( FILE ). 'Inclui / style.php');
Ronny
1
Tenho certeza que você não usa isso no seu style.php. Se o arquivo de estilo não for chamado pelo WordPress, nenhuma função do WordPress estará disponível.
fuxia

Respostas:

26

As funções do WordPress estão disponíveis apenas se o WordPress estiver carregado. Se você ligar style.phpdiretamente, não poderá usar a função WordPress.

Uma maneira simples de carregar o WordPress para sua folha de estilo baseada em PHP é adicionar um ponto de extremidade ao WordPress: um URL reservado e personalizado onde você carrega seu arquivo de modelo.

Para chegar lá, você precisa:

  1. Registre um terminal 'init'com add_rewrite_endpoint(). Vamos nomear 'phpstyle'.

  2. Conecte-se 'request'e verifique se a variável do terminal 'phpstyle'não está vazia se estiver configurada. Leia o excelente Guia completo A (principalmente) de Christopher Davis para a API de reescrita do WordPress para entender o que está acontecendo aqui.

  3. Conecte 'template_redirect'e entregue seu arquivo em vez do arquivo de modelo padrão index.php.

Para manter as coisas curtas, combinei as três etapas simples em uma função no seguinte plugin de demonstração.

Estilo PHP de plug-in

<?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;
}

Instale o plug-in, visite wp-admin/options-permalink.phpuma vez para atualizar as regras de reescrita e adicione um style.phpao seu tema.

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

Agora visite yourdomain/phpstyle/. Saída:

/* WordPress 3.3.2 */

default

Mas se você for para yourdomain/phpstyle/blue/a saída é:

/* WordPress 3.3.2 */

blue

Assim, você pode usar o terminal para fornecer diferentes folhas de estilo com um arquivo, dependendo do valor de get_query_var( 'phpstyle' ).

Embargo

Isso desacelerará seu site. O WordPress deve ser carregado duas vezes para cada visita. Não faça isso sem cache agressivo.

fuxia
fonte
+1 para portar isso para o WP. Ideia suma: get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )para acelerar as coisas ... e se, em seguida, todas as funções necessárias estão disponíveis ...
kaiser
1

Você pode fazer isso carregando a saída via admin-ajax.php, mas uma abordagem melhor para isso é usar a SHORTINITconstante do WordPress para carregar apenas as funções necessárias, mas você precisará encontrar e carregar wp-load.phppara fazer isso:

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

Nesse ponto, você precisará incluir quaisquer outros wp-includesarquivos necessários para obter suas opções de tema - que variam dependendo de como você está salvando e, portanto, acessando-os. (Você provavelmente precisará adicionar mais a esta lista para não obter erros fatais - mas, à medida que for avançando, os erros fatais informarão quais arquivos você precisa adicionar.) Por exemplo.

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

Então, quando você tiver todas as funções necessárias, poderá gerar o CSS usando essas funções ... por exemplo.

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

Em seguida, você pode enfileirar o arquivo normalmente, por exemplo:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');
majick
fonte
Ao adicionar seu código aos meus arquivos, ele ainda diz indefinido. Este é o meu código: pastebin.com/BJaUWX1x
J. Doe
você não precisa a ../../no wp-load.phpcaminho, a função dada vai encontrá-lo para você como é ... mas como eu disse que você precisa encontrar e incluir quaisquer arquivos que você precisa que têm as funções que você está usando, por exemplo. get_background_imageestá em theme.phpetc ... À medida que você adiciona ao CSS, você pode precisar de mais, então precisará aprender como encontrá-los para usar esse método de maneira eficaz e confiável.
4196