ฉันจะใช้ฟังก์ชัน WordPress ในสไตล์ชีทของฉันได้อย่างไร


21

ฉันให้style.phpไฟล์ของฉันมีลักษณะเช่นนี้

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

สิ่งนี้ไม่ทำงาน แต่เมื่อฉันทำสิ่งนี้จะได้ผล

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

จะมีปัญหาอะไร?

นี่คือ 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');

นี่คือจริงในส่วนผู้ดูแล


WordPress เรียกว่าอย่างไรใน style.php
fuxia

ฉันใช้ wp_enqueue_scripts ();
Ronny

wp_enqueue_style ('my_style', plugin_dir_url ( FILE ) .'Includes / style.php ')
Ronny

1
style.phpผมค่อนข้างมั่นใจว่าคุณไม่ได้ใช้ว่าในของคุณ หากไฟล์สไตล์นั้นไม่ถูกเรียกโดย WordPress จะไม่มีฟังก์ชั่น WordPress ให้ใช้งาน
fuxia

คำตอบ:


26

ฟังก์ชั่น WordPress ใช้งานได้ต่อเมื่อโหลด WordPress แล้วเท่านั้น หากคุณโทรหาคุณstyle.phpโดยตรงคุณจะไม่สามารถใช้ฟังก์ชั่น WordPress ได้

วิธีง่ายๆในการโหลด WordPress สำหรับสไตล์ชีทที่ขับเคลื่อนด้วย PHP ของคุณคือการเพิ่ม endpoint ให้ WordPress: URL ที่กำหนดเองและสงวนไว้ซึ่งคุณโหลดไฟล์เทมเพลตของคุณ

ในการไปถึงที่นั่นคุณต้อง:

  1. ลงทะเบียนปลายทางบนด้วย'init' add_rewrite_endpoint()Let 's 'phpstyle'ชื่อ

  2. ขอ'request'และตรวจสอบให้แน่ใจว่าตัวแปรจุดสิ้นสุด'phpstyle'ไม่ว่างเปล่าหากมีการตั้งค่าไว้ อ่านคริสโตเฟอร์เดวิสยอดเยี่ยมA (ส่วนใหญ่) คู่มือฉบับสมบูรณ์สำหรับ WordPress Rewrite APIเพื่อทำความเข้าใจว่าเกิดอะไรขึ้นที่นี่

  3. Hook เข้าและส่งไฟล์ของคุณแทนของไฟล์แม่แบบเริ่มต้น'template_redirect'index.php

เพื่อให้สิ่งต่าง ๆ สั้นลงฉันได้รวมขั้นตอนง่าย ๆ ทั้งสามไว้ในฟังก์ชันเดียวในปลั๊กอินสาธิตต่อไปนี้

ปลั๊กอินสไตล์ 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;
}

ติดตั้งปลั๊กอินเยี่ยมชมwp-admin/options-permalink.phpหนึ่งครั้งเพื่อรีเฟรชกฎการเขียนซ้ำและเพิ่มลงstyle.phpในธีมของคุณ

ตัวอย่าง 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' );

yourdomain/phpstyle/ตอนนี้เข้าชม เอาท์พุท:

/* WordPress 3.3.2 */

default

แต่ถ้าคุณไปyourdomain/phpstyle/blue/ที่ผลลัพธ์คือ:

/* WordPress 3.3.2 */

blue

get_query_var( 'phpstyle' )ดังนั้นคุณสามารถใช้ปลายทางที่จะส่งมอบสไตล์ชีตที่แตกต่างกับหนึ่งไฟล์ขึ้นอยู่กับมูลค่าของ

ข้อแม้

สิ่งนี้จะทำให้ไซต์ของคุณช้าลง WordPress จะต้องโหลดสองครั้งสำหรับการเยี่ยมแต่ละครั้ง อย่าทำมันโดยไม่ต้องแคชอย่างจริงจัง


+1 สำหรับการย้ายสิ่งนี้ไปยัง WP แนวคิดสั้น ๆ : get_query_var( 'phpstyle' ) AND ! defined( 'SHORTINIT' ) AND define( 'SHORTINIT', true )เพื่อเร่งความเร็ว ... และถ้าเช่นนั้นฟังก์ชั่นที่จำเป็นทั้งหมดจะพร้อมใช้งาน ...
kaiser

1

คุณสามารถทำได้โดยการโหลดผลลัพธ์ผ่านadmin-ajax.phpแต่วิธีที่ดีกว่าคือใช้SHORTINITค่าคงที่ของWordPress เพื่อให้คุณสามารถโหลดฟังก์ชันที่คุณต้องการได้ แต่คุณจะต้องค้นหาและโหลด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');

ณ จุดนี้คุณจะต้องแน่ใจว่าได้รวมwp-includesไฟล์อะไรก็ตามที่คุณต้องการเพื่อรับตัวเลือกชุดรูปแบบของคุณ - ซึ่งจะแตกต่างกันไปตามวิธีการบันทึกและการเข้าถึงไฟล์เหล่านั้น (คุณอาจจะต้องเพิ่มมากขึ้นในรายการนี้เพื่อให้คุณไม่ได้รับข้อผิดพลาดร้ายแรง - แต่เมื่อคุณไปข้อผิดพลาดร้ายแรงจะบอกคุณว่าไฟล์ที่คุณต้องเพิ่ม) เช่น

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

จากนั้นเมื่อคุณมีฟังก์ชั่นทั้งหมดที่คุณต้องการคุณสามารถส่งออก CSS โดยใช้ฟังก์ชั่นเหล่านั้น ... เช่น

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

จากนั้นคุณสามารถจัดคิวไฟล์ตามปกติตัวอย่างเช่น:

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

เมื่อเพิ่มรหัสของคุณไปยังไฟล์ของฉันมันยังคงบอกว่าไม่ได้กำหนด นี่คือรหัสของฉัน: pastebin.com/BJaUWX1x
J. Doe

คุณไม่จำเป็นต้อง../../อยู่บนwp-load.phpพา ธ ฟังก์ชั่นที่ให้มาจะหาให้คุณตามที่เป็นอยู่ ... แต่อย่างที่ฉันบอกว่าคุณจำเป็นต้องค้นหาและรวมไฟล์อะไรก็ตามที่คุณต้องการซึ่งมีฟังก์ชั่นที่คุณใช้อยู่เช่น get_background_imageอยู่ในtheme.phpetc ... ตามที่คุณเพิ่มใน CSS คุณอาจต้องการเพิ่มเติมดังนั้นคุณจะต้องเรียนรู้วิธีการค้นหาเพื่อใช้วิธีนี้อย่างมีประสิทธิภาพและเชื่อถือได้
majick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.