¿Cómo puedo usar las funciones de WordPress en mi hoja de estilo?

21

Tengo mi style.phparchivo con este aspecto.

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

Esto no funciona, pero cuando hago esto funciona.

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

¿Cuál sería el problema?

Este es el 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');

Esto está realmente en la sección de administración.

Ronny
fuente
¿Cómo se llama WordPress en style.php?
fuxia
Usé wp_enqueue_scripts ();
Ronny
wp_enqueue_style ('my_style', plugin_dir_url ( FILE ) .'Includes / style.php ');
Ronny
1
Estoy bastante seguro de que no usas eso en tu style.php. Si WordPress no llama al archivo de estilo, no hay función de WordPress disponible.
fuxia

Respuestas:

26

Las funciones de WordPress están disponibles solo si WordPress está cargado. Si llama style.phpdirectamente, no puede usar una función de WordPress.

Una forma sencilla de cargar WordPress para su hoja de estilo controlada por PHP es agregar un punto final a WordPress: una URL personalizada y reservada donde carga su archivo de plantilla.

Para llegar hay que:

  1. Registre un punto final 'init'con add_rewrite_endpoint(). Vamos a nombrarlo 'phpstyle'.

  2. Conéctese 'request'y asegúrese de que la variable de punto final 'phpstyle'no esté vacía si está configurada. Lea la excelente Guía completa de Christopher Davis (principalmente) de la API de reescritura de WordPress para comprender lo que está sucediendo aquí.

  3. Conéctese 'template_redirect'y entregue su archivo en lugar del archivo de plantilla predeterminado index.php.

Para mantener las cosas cortas, combiné los tres pasos simples en una función en el siguiente complemento de demostración.

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

Instale el complemento, visite wp-admin/options-permalink.phpuna vez para actualizar las reglas de reescritura y agregue un style.phpa su tema.

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

Ahora visita yourdomain/phpstyle/. Salida:

/* WordPress 3.3.2 */

default

Pero si vas a yourdomain/phpstyle/blue/la salida es:

/* WordPress 3.3.2 */

blue

Por lo tanto, puede usar el punto final para entregar diferentes hojas de estilo con un archivo dependiendo del valor de get_query_var( 'phpstyle' ).

Advertencia

Esto ralentizará su sitio. WordPress tiene que cargarse dos veces por cada visita. No lo hagas sin un almacenamiento en caché agresivo.

fuxia
fuente
+1 por portar esto a WP. Breve idea: get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )acelerar las cosas ... y si entonces todas las funciones necesarias están disponibles ...
kaiser
1

Puede hacer esto cargando la salida a través de admin-ajax.php, pero un mejor enfoque para eso es usar la SHORTINITconstante de WordPress para que pueda cargar las funciones que necesita, pero necesitará encontrar y cargar wp-load.phppara hacer esto:

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

En este punto se necesita para asegurarse de incluir cualquier otro wp-includesarchivos que necesita para obtener sus opciones de tema - que variarán dependiendo de su forma va a guardar y acceder así a los. (Probablemente necesitará agregar más a esta lista para que no obtenga errores fatales, pero a medida que avanza, los errores fatales le indicarán qué archivos debe agregar).

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

Luego, una vez que tenga todas las funciones que necesita, puede generar el CSS utilizando esas funciones ... por ejemplo.

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

Luego puede poner en cola el archivo de la forma habitual, por ejemplo:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');
majick
fuente
Al agregar su código a mis archivos, todavía dice indefinido. Este es mi código: pastebin.com/BJaUWX1x
J. Doe
no necesita el ../../en el wp-load.phpcamino, la función dada lo encontrará por usted tal como está ... pero como dije, necesita encontrar e incluir cualquier archivo que necesite que tenga las funciones que está utilizando, por ejemplo. get_background_imageestá en theme.phpetc ... a medida que agrega al CSS puede que necesite más, por lo que deberá aprender cómo encontrarlos para usar este método de manera efectiva y confiable.
majick