Jak korzystać z funkcji WordPress w arkuszu stylów?

21

Mój style.phpplik wygląda tak.

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

To nie działa, ale kiedy to robię, działa.

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

Jaki byłby problem?

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

To jest właściwie w sekcji administratora.

Ronny
źródło
Jak nazywa się WordPress w style.php?
fuxia
Użyłem wp_enqueue_scripts ();
Ronny
wp_enqueue_style ('my_style', plugin_dir_url ( FILE ). 'Zawiera / style.php');
Ronny
1
Jestem prawie pewien, że tego nie używasz style.php. Jeśli plik stylu nie jest wywoływany przez WordPress, funkcja WordPress nie jest dostępna.
fuxia

Odpowiedzi:

26

Funkcje WordPress są dostępne tylko po załadowaniu WordPress. Jeśli zadzwonisz style.phpbezpośrednio, nie możesz użyć funkcji WordPress.

Jednym prostym sposobem załadowania WordPressa do arkusza stylów opartego na PHP jest dodanie punktu końcowego do WordPress: niestandardowego, zarezerwowanego adresu URL, w którym ładujesz plik szablonu.

Aby się tam dostać, musisz:

  1. Zarejestrować się na końcowy 'init'z add_rewrite_endpoint(). Nazwijmy to 'phpstyle'.

  2. Podłącz się 'request'i upewnij się, że zmienna punktu końcowego 'phpstyle'nie jest pusta, jeśli jest ustawiona. Przeczytaj doskonały A (głównie) kompletny przewodnik Christophera Davisa po WordPress Rewrite API, aby zrozumieć, co się tutaj dzieje.

  3. Podłącz 'template_redirect'i dostarcz plik zamiast domyślnego pliku szablonu index.php.

Krótko mówiąc, połączyłem wszystkie trzy proste kroki w jednej funkcji w następującej wtyczce demonstracyjnej.

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

Zainstaluj wtyczkę, odwiedź wp-admin/options-permalink.phpraz, aby odświeżyć reguły przepisywania i dodaj style.phpdo swojego motywu.

Próba 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' );

Teraz odwiedź yourdomain/phpstyle/. Wydajność:

/* WordPress 3.3.2 */

default

Ale jeśli przejdziesz do yourdomain/phpstyle/blue/wyjścia to:

/* WordPress 3.3.2 */

blue

Możesz więc użyć punktu końcowego do dostarczania różnych arkuszy stylów z jednym plikiem, w zależności od wartości get_query_var( 'phpstyle' ).

Zastrzeżenie

Spowolni to działanie Twojej witryny. WordPress musi być ładowany dwa razy dla każdej wizyty. Nie rób tego bez agresywnego buforowania.

fuxia
źródło
+1 za przeniesienie tego do WP. Krótki pomysł: get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )aby przyspieszyć ... a jeśli tak, wszystkie potrzebne funkcje są dostępne ...
Kaiser
1

Możesz to zrobić, ładując dane wyjściowe za pośrednictwem admin-ajax.php, ale lepszym rozwiązaniem jest użycie SHORTINITstałej WordPress , abyś mógł załadować tylko potrzebne funkcje, ale musisz to znaleźć i załadować wp-load.php:

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

W tym momencie musisz upewnić się, że dołączasz wszelkie inne wp-includespliki potrzebne do uzyskania opcji motywu - które będą się różnić w zależności od sposobu zapisywania, a tym samym dostępu do nich. (Prawdopodobnie będziesz musiał dodać więcej do tej listy, aby nie pojawiały się błędy krytyczne - ale w miarę upływu czasu błędy krytyczne wskażą, które pliki należy dodać.) Np.

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

Następnie, gdy masz już wszystkie potrzebne funkcje, możesz wygenerować CSS za pomocą tych funkcji ... np.

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

Następnie możesz kolejkować plik jak zwykle, na przykład:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');
majick
źródło
Podczas dodawania kodu do moich plików nadal pojawia się komunikat niezdefiniowany. To jest mój kod: pastebin.com/BJaUWX1x
J. Doe
nie potrzebne są ../../na wp-load.phpścieżce, funkcję daną znajdzie je dla Ciebie, jak to ... ale jak powiedziałem trzeba zrobić, aby znaleźć i to niezależnie plików ty potrzebować które mają funkcje, którego używasz, np. get_background_imagejest w theme.phpetc ... gdy dodajesz do CSS, możesz potrzebować więcej, więc musisz nauczyć się, jak je znaleźć, aby korzystać z tej metody skutecznie i niezawodnie.
majick