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

20

Eu tenho meu arquivo style.php parecido com isso.

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

Isso não funciona, mas quando eu 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');

Isso está na seção admin.

    
por Ronny 08.06.2012 / 17:44

2 respostas

24

As funções do WordPress estão disponíveis somente se o WordPress estiver carregado. Se você chamar seu style.php diretamente, não poderá usar uma função do WordPress.

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

Para chegar lá, você precisa:

  1. Registre um endpoint em 'init' com add_rewrite_endpoint() . Vamos citar 'phpstyle' .

  2. Conecte-se a 'request' e verifique se a variável de endpoint 'phpstyle' não está vazia, se estiver definida. Leia o excelente guia completo da API de reescrita do WordPress de Christopher Davis para entender o que está acontecendo aqui.

  3. Conecte-se a '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 na função one no seguinte plug-in de demonstração.

Estilo PHP de Plugin

<?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, acesse wp-admin/options-permalink.php uma vez para atualizar as regras de reconfiguração e adicione um style.php ao 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 será:

/* WordPress 3.3.2 */

blue

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

Advertência

Isto irá abrandar o seu site. WordPress tem que ser carregado duas vezes para cada visita. Não faça isso sem um cache agressivo.

    
por fuxia 08.06.2012 / 21:48
1

Você poderia fazer isso carregando a saída via admin-ajax.php , mas uma abordagem melhor para isso é usar o WordPress SHORTINIT constant para que você possa carregar apenas as funções necessárias, mas precisará localizar e carregar wp-load.php para 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');

Neste ponto, você precisará precisar para incluir todos os outros arquivos wp-includes necessários para obter as opções do tema - o que variará dependendo de como você está salvando e acessando-as. (Você provavelmente precisará adicionar mais a esta lista para não receber erros fatais - mas, conforme você está indo, os erros fatais lhe dirão quais arquivos você precisa adicionar).

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, depois de ter todas as funções necessárias, você pode 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;

Depois, você pode enfileirar o arquivo normalmente, por exemplo:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');
    
por majick 03.06.2016 / 13:41