Comment utiliser les fonctions WordPress dans ma feuille de style?

20

J'ai le fichier style.php qui ressemble à ceci.

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

Cela ne fonctionne pas, mais lorsque je le fais, cela fonctionne.

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

Quel serait le problème?

Ceci est le fichier 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');

C’est actuellement dans la section admin.

    
posée Ronny 08.06.2012 - 17:44

2 réponses

24

Les fonctions WordPress sont disponibles uniquement si WordPress est chargé. Si vous appelez directement votre style.php , vous ne pourrez pas utiliser une fonction WordPress.

Un moyen simple de charger WordPress pour votre feuille de style PHP consiste à ajouter un point de terminaison à WordPress: une URL personnalisée et réservée dans laquelle vous chargez votre fichier de modèle.

Pour y arriver, vous devez:

  1. Enregistrez un point de terminaison sur 'init' avec add_rewrite_endpoint() . Appelons-le 'phpstyle' .

  2. Accédez à 'request' et assurez-vous que la variable de noeud final 'phpstyle' n'est pas vide si elle est définie. Lisez l'excellent guide complet (en général) de l'API WordPress Rewrite pour comprendre ce qui se passe ici.

  3. Accrochez-vous dans 'template_redirect' et livrez votre fichier à la place du fichier de modèle par défaut index.php .

Pour faire court, j'ai combiné les trois étapes simples dans la une fonction du plugin de démonstration suivant.

Style de plugin PHP

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

Installez le plug-in, visitez une fois wp-admin/options-permalink.php pour actualiser les règles de réécriture et ajoutez un style.php à votre thème.

Exemple de calcul 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' );

Visitez maintenant yourdomain/phpstyle/ . Sortie:

/* WordPress 3.3.2 */

default

Mais si vous allez à yourdomain/phpstyle/blue/ , le résultat est:

/* WordPress 3.3.2 */

blue

Vous pouvez donc utiliser le noeud final pour créer différentes feuilles de style avec un seul fichier en fonction de la valeur de get_query_var( 'phpstyle' ) .

Mise en garde

Cela ralentira votre site. WordPress doit être chargé deux fois à chaque visite. Ne le faites pas sans la mise en cache agressive.

    
réponse donnée fuxia 08.06.2012 - 21:48
1

Vous pouvez le faire en chargeant la sortie via admin-ajax.php , mais une meilleure approche consiste à utiliser WordPress SHORTINIT constant afin de pouvoir charger uniquement les fonctions dont vous avez besoin, mais vous devrez trouver et charger% co_de. % à faire ceci:

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

À ce stade, vous aurez besoin de vous assurer d'inclure tous les autres fichiers wp-load.php dont vous avez besoin pour obtenir vos options de thème, ce qui varie en fonction de votre mode d'enregistrement et d'accès. (Vous devrez probablement ajouter des éléments supplémentaires à cette liste pour éviter les erreurs fatales - mais au fur et à mesure, les erreurs fatales vous indiqueront les fichiers à ajouter.) Par exemple.

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

Ensuite, une fois que vous avez toutes les fonctions dont vous avez besoin, vous pouvez générer le CSS à l'aide de ces fonctions ... par exemple.

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

Vous pouvez ensuite mettre le fichier en file d'attente normalement, par exemple:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');
    
réponse donnée majick 03.06.2016 - 13:41

Lire d'autres questions sur les étiquettes