Wie kann ich WordPress-Funktionen in meinem Stylesheet verwenden?

21

Ich habe meine style.phpDatei so aussehen.

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

Das funktioniert nicht, aber wenn ich das tue, funktioniert es.

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

Was wäre das Problem?

Dies ist die 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');

Dies ist eigentlich im Admin-Bereich.

Ronny
quelle
Wie heißt WordPress in style.php?
fuxia
Ich habe wp_enqueue_scripts () verwendet.
Ronny
wp_enqueue_style ('my_style', plugin_dir_url ( FILE ) .'Includes / style.php ');
Ronny
1
Ich bin mir ziemlich sicher, dass du das in deinem nicht verwendest style.php. Wenn die Stildatei nicht von WordPress aufgerufen wird, ist keine WordPress-Funktion verfügbar.
fuxia

Antworten:

26

WordPress-Funktionen sind nur verfügbar, wenn WordPress geladen ist. Wenn Sie style.phpdirekt anrufen, können Sie keine WordPress-Funktion verwenden.

Eine einfache Möglichkeit, WordPress für Ihr PHP-gesteuertes Stylesheet zu laden, besteht darin, WordPress einen Endpunkt hinzuzufügen: eine benutzerdefinierte, reservierte URL, unter der Sie Ihre Vorlagendatei laden.

Um dorthin zu gelangen, müssen Sie:

  1. Registrieren Sie einen Endpunkt 'init'mit add_rewrite_endpoint(). Nennen wir es 'phpstyle'.

  2. Hängen Sie sich ein 'request'und stellen Sie sicher, dass die Endpunktvariable 'phpstyle'nicht leer ist, wenn sie festgelegt ist. Lesen Sie Christopher Davis 'hervorragendes A (Mostly) Complete Guide zur WordPress Rewrite API, um zu verstehen, was hier vor sich geht.

  3. Hängen Sie an 'template_redirect'und liefern Sie Ihre Datei anstelle der Standardvorlagendatei index.php.

Um die Sache kurz zu halten, habe ich im folgenden Demo-Plugin alle drei einfachen Schritte in einer Funktion zusammengefasst.

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

Installieren Sie das Plugin, besuchen Sie wp-admin/options-permalink.phpeinmal, um die Umschreiberegeln zu aktualisieren, und fügen Sie ein style.phpzu Ihrem Thema hinzu.

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

Jetzt besuchen yourdomain/phpstyle/. Ausgabe:

/* WordPress 3.3.2 */

default

Aber wenn Sie zur yourdomain/phpstyle/blue/Ausgabe gehen, ist:

/* WordPress 3.3.2 */

blue

Sie können den Endpunkt also verwenden, um abhängig vom Wert von verschiedene Stylesheets mit einer Datei zu liefern get_query_var( 'phpstyle' ).

Vorbehalt

Dies wird Ihre Website verlangsamen. WordPress muss bei jedem Besuch zweimal geladen werden . Tun Sie es nicht ohne aggressives Caching.

fuxia
quelle
+1 für die Portierung nach WP. Kurze idee: get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )um die dinge zu beschleunigen ... und wenn dann alle benötigten funktionen zur
verfügung
1

Sie könnten dies tun, indem Sie die Ausgabe über laden. admin-ajax.phpEin besserer Ansatz besteht darin, die WordPress- SHORTINITKonstante zu verwenden, damit Sie genau die Funktionen laden können, die Sie benötigen. wp-load.phpDazu müssen Sie jedoch Folgendes finden und laden :

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

An dieser Stelle werden Sie müssen sicher sein , enthalten , was andere wp-includesDateien , die Sie Ihr Thema Optionen erhalten müssen - das variiert je nach , wie Sie sparen und damit diejenigen erreichbar. (Wahrscheinlich müssen Sie dieser Liste weitere hinzufügen, damit Sie keine schwerwiegenden Fehler erhalten. Im weiteren Verlauf werden Sie jedoch anhand der schwerwiegenden Fehler darüber informiert, welche Dateien Sie hinzufügen müssen.) Beispiel:

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

Sobald Sie alle Funktionen haben, die Sie benötigen, können Sie das CSS mit diesen Funktionen ausgeben ... zB.

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

Anschließend können Sie die Datei wie gewohnt in die Warteschlange einreihen. Beispiel:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');
Majick
quelle
Wenn Sie Ihren Code zu meinen Dateien hinzufügen, wird immer noch undefined angezeigt. Dies ist mein Code: pastebin.com/BJaUWX1x
J. Doe
Sie brauchen das ../../auf dem wp-load.phpPfad nicht, die angegebene Funktion wird es für Sie so finden, wie es ist ... aber wie ich bereits sagte, Sie müssen alle benötigten Dateien mit den von Ihnen verwendeten Funktionen finden und einschließen , z. get_background_imageis in theme.phpetc ... Wenn Sie das CSS erweitern, benötigen Sie möglicherweise mehr. Daher müssen Sie lernen, wie Sie sie finden, um diese Methode effektiv und zuverlässig verwenden zu können.
Majick