web-dev-qa-db-ja.com

スタイルシートでWordPressの機能を使用する方法

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

これは実際にはadminセクションにあります。

21
Ronny

WordPress機能は、WordPressがロードされている場合にのみ利用可能です。 style.phpを直接呼び出す場合は、WordPressの機能を使用することはできません。

PHP駆動スタイルシートにWordPressをロードする簡単な方法の1つは、WordPressにエンドポイントを追加することです。テンプレートファイルをロードするカスタムの予約済みURLです。

そこに着くためにあなたがしなければならない:

  1. add_rewrite_endpoint()'init'にエンドポイントを登録します。 'phpstyle'という名前を付けましょう。

  2. 'request'にフックし、エンドポイント変数'phpstyle'が設定されている場合は空にしないでください。ここで何が起こっているのかを理解するには、Christopher Davisの優れた A(ほとんどの場合)WordPress書き換えAPIの完全なガイド をお読みください。

  3. 'template_redirect'にフックして、デフォルトのテンプレートファイルindex.phpの代わりにあなたのファイルを配布してください。

簡単にするために、次のデモプラグインのone functionの3つの簡単な手順をすべて組み合わせました。

プラグイン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' )の値に応じて、エンドポイントを使用して1つのファイルでさまざまなスタイルシートを配信できます。

警告

これはあなたのサイトを遅くするでしょう。 WordPressは訪問ごとに 2回 をロードする必要があります。積極的なキャッシュなしでそれをしないでください。

26
fuxia

admin-ajax.phpを介して出力をロードすることでこれを行うことができますが、それに対するより良いアプローチはWordPress SHORTINIT定数を使用することです。これを行うには、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');

この時点でneedテーマオプションを取得するために必要な他の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');
1
majick