web-dev-qa-db-fra.com

Comment utiliser les fonctions WordPress dans ma feuille de style?

Mon fichier style.php 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?

C'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 en fait dans la section admin.

21
Ronny

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 pilotée par PHP consiste à ajouter un point de terminaison à WordPress: une URL réservée personnalisée à laquelle vous chargez le fichier de modèle.

Pour y arriver, vous devez:

  1. Enregistrez un terminal 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 de Christopher Davis Un guide (généralement) complet 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 rester bref, j'ai combiné les trois étapes simples dans la fonction une dans le plug-in de démonstration suivant.

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

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

Maintenant, visitez yourdomain/phpstyle/. Sortie:

/* WordPress 3.3.2 */

default

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

/* WordPress 3.3.2 */

blue

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

Avertissement

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

26
fuxia

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

// 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 pour être sûr d'inclure tous les autres fichiers wp-includes dont vous avez besoin pour obtenir vos options de thème - qui varieront en fonction de votre mode d'enregistrement et d'accès. (Vous devrez probablement ajouter d'autres éléments à cette liste pour éviter les erreurs fatales - mais au fur et à mesure, les erreurs fatales vous indiqueront quels fichiers vous devez 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 sortir le CSS en utilisant ces fonctions ... par exemple.

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

Ensuite, vous pouvez mettre le fichier en file d'attente comme d'habitude, par exemple:

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