Come posso usare le funzioni di WordPress nel mio foglio di stile?


21

Ho il mio style.phpfile simile a questo.

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

Questo non funziona, ma quando lo faccio funziona.

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

Quale sarebbe il problema?

Questo è il 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');

Questo è in realtà nella sezione admin.


Come si chiama WordPress in style.php?
fuxia

Ho usato wp_enqueue_scripts ();
Ronny,

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

1
Sono abbastanza sicuro che non lo usi nel tuo style.php. Se il file di stile non viene chiamato da WordPress, non è disponibile alcuna funzione di WordPress.
fuxia

Risposte:


26

Le funzioni di WordPress sono disponibili solo se WordPress è caricato. Se chiami style.phpdirettamente non puoi usare una funzione WordPress.

Un modo semplice per caricare WordPress per il tuo foglio di stile basato su PHP è aggiungere un endpoint a WordPress: un URL riservato e riservato in cui caricare il file modello.

Per arrivarci devi:

  1. Registrare un endpoint 'init'con add_rewrite_endpoint(). Diamo un nome 'phpstyle'.

  2. Agganciare 'request'e assicurarsi che la variabile dell'endpoint 'phpstyle'non sia vuota se è impostata. Leggi l'eccellente A (per lo più) completa guida di Christopher Davis all'API di riscrittura di WordPress per capire cosa sta succedendo qui.

  3. Aggancia 'template_redirect'e consegna il tuo file invece del file modello predefinito index.php.

Per farla breve, ho combinato tutti e tre i semplici passaggi in un'unica funzione nel seguente plugin demo.

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

Installa il plug-in, visita wp-admin/options-permalink.phpuna volta per aggiornare le regole di riscrittura e aggiungi astyle.php al tuo tema.

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

Adesso visita yourdomain/phpstyle/. Produzione:

/* WordPress 3.3.2 */

default

Ma se vai yourdomain/phpstyle/blue/all'output è:

/* WordPress 3.3.2 */

blue

Quindi è possibile utilizzare l'endpoint per fornire fogli di stile diversi con un file a seconda del valore di get_query_var( 'phpstyle' ).

Avvertimento

Questo rallenterà il tuo sito. WordPress deve essere caricato due volte per ogni visita. Non farlo senza una cache aggressiva.


+1 per il porting su WP. Breve idea: get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )accelerare le cose ... e se poi sono disponibili tutte le funzioni necessarie ...
Kaiser

1

Puoi farlo caricando l'output tramite admin-ajax.php, ma un approccio migliore è quello di utilizzare la SHORTINITcostante di WordPress in modo da poter caricare solo le funzioni di cui hai bisogno, ma dovrai trovare e caricare wp-load.phpper farlo:

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

A questo punto dovrai essere sicuro di includere qualunque altro wp-includesfile ti serva per ottenere le opzioni del tuo tema, che varieranno a seconda di come stai salvando e quindi accedendo a quelli. (Probabilmente dovrai aggiungere altro a questo elenco in modo da non ottenere errori irreversibili, ma mentre procedi, gli errori fatali ti diranno quali file devi aggiungere.) Ad es.

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

Quindi una volta che hai tutte le funzioni di cui hai bisogno, puoi generare il CSS usando quelle funzioni ... ad es.

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

Quindi è possibile accodare il file normalmente, ad esempio:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');

Quando aggiungi il tuo codice ai miei file, dice ancora indefinito. Questo è il mio codice: pastebin.com/BJaUWX1x
J. Doe,

non è necessario il ../../sul wp-load.phppercorso, la funzione data lo troverà per voi come è ... ma come ho detto si ha bisogno di trovare e includere qualsiasi file si bisogno che hanno le funzioni che si sta utilizzando, ad esempio. get_background_imageè in theme.phpecc ... man mano che aggiungi al CSS potresti aver bisogno di più, quindi dovrai imparare come trovarli per usare questo metodo in modo efficace e affidabile.
Maj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.