Bagaimana saya bisa menggunakan fungsi WordPress di stylesheet saya?

21

style.phpFile saya terlihat seperti ini.

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

Ini tidak bekerja, tetapi ketika saya melakukan ini, ini berhasil.

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

Apa masalahnya?

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

Ini sebenarnya di bagian admin.

Ronny
sumber
Bagaimana WordPress dipanggil dengan style.php?
fuxia
Saya menggunakan wp_enqueue_scripts ();
Ronny
wp_enqueue_style ('my_style', plugin_dir_url ( FILE ). 'Termasuk / style.php');
Ronny
1
Saya cukup yakin Anda tidak menggunakannya di style.php. Jika file gaya tidak dipanggil oleh WordPress, tidak ada fungsi WordPress yang tersedia.
fuxia

Jawaban:

26

Fungsi WordPress hanya tersedia jika WordPress dimuat. Jika Anda menelepon style.phplangsung, Anda tidak dapat menggunakan fungsi WordPress.

Salah satu cara sederhana untuk memuat WordPress untuk stylesheet yang digerakkan oleh PHP adalah dengan menambahkan titik akhir ke WordPress: URL khusus yang dipesan di mana Anda memuat file templat Anda.

Untuk sampai di sana Anda harus:

  1. Daftarkan titik akhir 'init'dengan add_rewrite_endpoint(). Sebut saja 'phpstyle'.

  2. Kaitkan ke dalam 'request'dan pastikan variabel titik akhir 'phpstyle'tidak kosong jika disetel. Bacalah Panduan Lengkap A (Sebagian Besar) yang bagus dari Christopher Davis untuk WordPress Rewrite API untuk memahami apa yang terjadi di sini.

  3. Kaitkan ke dalam 'template_redirect'dan kirim file Anda alih-alih file templat default index.php.

Agar semuanya singkat, saya menggabungkan ketiga langkah sederhana dalam satu fungsi di plugin demo berikut.

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

Instal plugin, kunjungi wp-admin/options-permalink.phpsekali untuk menyegarkan aturan penulisan ulang, dan tambahkan style.phpke tema Anda.

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

Kunjungi sekarang yourdomain/phpstyle/. Keluaran:

/* WordPress 3.3.2 */

default

Tetapi jika Anda pergi ke yourdomain/phpstyle/blue/output adalah:

/* WordPress 3.3.2 */

blue

Jadi, Anda dapat menggunakan titik akhir untuk memberikan stylesheet yang berbeda dengan satu file tergantung pada nilai get_query_var( 'phpstyle' ).

Peringatan

Ini akan memperlambat situs Anda. WordPress harus dimuat dua kali untuk setiap kunjungan. Jangan lakukan itu tanpa caching yang agresif.

fuxia
sumber
+1 untuk porting ini ke WP. Gagasan singkat: get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )untuk mempercepat ... dan jika semua fungsi yang diperlukan tersedia ...
kaiser
1

Anda bisa melakukan ini dengan memuat output melalui admin-ajax.php, tetapi pendekatan yang lebih baik adalah dengan menggunakan SHORTINITkonstanta WordPress sehingga Anda dapat memuat fungsi apa saja yang Anda butuhkan, tetapi Anda harus mencari dan memuat wp-load.phpuntuk melakukan ini:

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

Pada titik ini Anda harus yakin menyertakan wp-includesfile apa pun yang Anda butuhkan untuk mendapatkan opsi tema - yang akan bervariasi tergantung pada cara Anda menyimpan dan mengaksesnya. (Anda mungkin perlu menambahkan lebih banyak ke daftar ini sehingga Anda tidak mendapatkan kesalahan fatal - tetapi ketika Anda akan melakukannya, kesalahan fatal akan memberi tahu Anda file mana yang perlu Anda tambahkan.) Mis.

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

Kemudian setelah Anda memiliki semua fungsi yang Anda butuhkan, Anda dapat menampilkan CSS menggunakan fungsi-fungsi itu ... mis.

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

Maka Anda dapat membuat file seperti biasa, misalnya:

wp_enqueue_style('custom-css',trailingslashit(get_template_directory_uri()).'styles.php');
majik
sumber
Saat menambahkan kode Anda ke file saya, masih dikatakan tidak terdefinisi. Ini adalah kode saya: pastebin.com/BJaUWX1x
J. Doe
Anda tidak memerlukannya ../../di wp-load.phpjalur, fungsi yang diberikan akan menemukannya untuk Anda apa adanya ... tapi seperti saya katakan Anda perlu menemukan dan memasukkan file apa pun yang Anda butuhkan yang memiliki fungsi yang Anda gunakan, misalnya. get_background_imageada di theme.phpdll ... saat Anda menambahkan ke CSS Anda mungkin perlu lebih banyak sehingga Anda perlu belajar bagaimana menemukan mereka untuk menggunakan metode ini secara efektif dan andal.
Majick