Comment puis-je utiliser les fonctions WordPress dans ma feuille de style?

21

J'ai mon style.phpdossier qui ressemble à ceci.

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

Cela ne fonctionne pas, mais quand 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 en fait dans la section admin.

Ronny
la source
Comment WordPress est-il appelé dans style.php?
fuxia
J'ai utilisé wp_enqueue_scripts ();
Ronny
wp_enqueue_style ('my_style', plugin_dir_url ( FILE ) .'Includes / style.php ');
Ronny
1
Je suis sûr que vous ne l'utilisez pas dans votre style.php. Si le fichier de style n'est pas appelé par WordPress, aucune fonction WordPress n'est disponible.
fuxia

Réponses:

26

Les fonctions WordPress ne sont disponibles que si WordPress est chargé. Si vous appelez style.phpdirectement votre, vous ne pouvez pas utiliser une fonction WordPress.

Une façon simple de charger WordPress pour votre feuille de style PHP est d'ajouter un point de terminaison à WordPress: une URL réservée personnalisée où vous chargez votre fichier de modèle.

Pour y arriver, vous devez:

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

  2. Connectez-vous 'request'et assurez-vous que la variable de point de terminaison 'phpstyle'n'est pas vide si elle est définie. Lisez l'excellent guide complet de Christopher Davis sur l'API WordPress Rewrite pour comprendre ce qui se passe ici.

  3. Accrochez 'template_redirect'et livrez votre fichier au lieu du fichier de modèle par défaut index.php.

Pour faire court, j'ai combiné les trois étapes simples dans une seule fonction dans le plugin 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 plugin, visitez wp-admin/options-permalink.phpune fois pour actualiser les règles de réécriture et ajoutez-en un style.phpà votre thème.

Échantillon 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/. Production:

/* WordPress 3.3.2 */

default

Mais si vous allez à yourdomain/phpstyle/blue/la sortie, c'est:

/* WordPress 3.3.2 */

blue

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

Caveat

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

fuxia
la source
+1 pour le porter sur WP. Petite idée: get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )pour accélérer les choses ... et si alors toutes les fonctions nécessaires sont disponibles ...
kaiser
1

Vous pouvez le faire en chargeant la sortie via admin-ajax.php, mais une meilleure approche consiste à utiliser WordPress SHORTINITconstant pour pouvoir charger exactement les fonctions dont vous avez besoin, mais vous devrez trouver et charger wp-load.phppour ce 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 devez être inclure que tout autre wp-includesfichiers dont vous avez besoin pour obtenir vos options thématiques - qui varie en fonction de votre façon dont vous enregistrez et donc l' accès à ceux -ci . (Vous devrez probablement ajouter plus à cette liste afin de ne pas obtenir d'erreurs fatales - mais au fur et à mesure, les erreurs fatales vous diront 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');
majick
la source
Lors de l'ajout de votre code à mes fichiers, il est toujours dit non défini. Voici mon code: pastebin.com/BJaUWX1x
J. Doe
vous n'avez pas besoin de ../../sur le wp-load.phpchemin, la fonction donnée le trouvera tel quel ... mais comme je l'ai dit, vous devez trouver et inclure tous les fichiers dont vous avez besoin qui ont les fonctions que vous utilisez, par exemple. get_background_imageest dans theme.phpetc ... au fur et à mesure que vous ajoutez au CSS, vous aurez peut-être besoin de plus, vous devrez donc apprendre à les trouver pour utiliser cette méthode de manière efficace et fiable.
majick