web-dev-qa-db-ja.com

CSSでテーマのオプションを表示する

私はこれを理解しようとして文字通り私の髪を引き抜いています。私はもう12時間近くそこにいました。

PHPとテーマ開発に不慣れなので、PHPスタイルシートを作成するときにtheme_options('value');を表示させる方法を理解するのに苦労しています。

私はparse_requestメソッドを使ってここで 読んだ ブログ記事から例を取りました。

header.phpのコード

<link rel='stylesheet' type='text/css' href="<?php echo get_template_directory() ?>/css/theme_styles.php?my-custom-content=css" />

そしてtheme-styles.php

<?php
    add_action( 'parse_request', 'my_custom_wp_request' );
    function my_custom_wp_request( $wp ) {
        if ( !empty( $_GET['my-custom-content'] ) && $_GET['my-custom-content'] == 'css' ) {
            # get theme options
            header( 'Content-Type: text/css' );
?>
        a { color: <?php echo get_option('some_other_option') ?> !important; }
<?php
        exit;
        }
    }
?>

それがポストの中でやらなければならないことはそれだけですので、今私は道に迷っています。私はまたうまくいかなかった他の多くの解決策を試してみました。任意の助けは大歓迎です!

1
Scott Reinmuth

@ Jevuskaは私の問題を解決しましたが、私は私のテーマオプションページから動的CSSを追加するためのもっと簡単な解決策を見つけました。さあ!

これをfunctions.phpに追加してください。

add_action('wp_head', 'my_custom_css');
function my_custom_css(){
require_once( get_template_directory() . '/css/theme-styles.php' );
}

これで、theme-styles.phpを通常のCSSスタイルシートとして扱うことができます

<style type="text/css">
a {
    color: <?php echo get_option('some_other_option');?> !important;
}
</style>

完了しました。それはとても簡単でした。

1
Scott Reinmuth

Parse_queryを操作してカスタマイズ可能なCSS

@ Scott Reinmuth、私はあなたがそれらのチュートリアルについて誤った指示だと思います、そうあなたは parse_request メソッドを使います。

あなたが従うならば、このコードはfunctionのフックです、そして、あなたはfunctions.phpを入れる必要があります

<?php
    add_action( 'parse_request', 'my_custom_wp_request' );
    function my_custom_wp_request( $wp ) {
        if ( !empty( $_GET['my-custom-content'] ) && $_GET['my-custom-content'] == 'css' ) {
        # get theme options
        header( 'Content-Type: text/css' );
?>
a {color: <?php echo get_option('some_other_option'); ?> !important;}
<?php
        exit; 
        }
    }
?>

そして、header.phpの中で(file/ css/theme_styles.phpなしで)パラメータmy-custom-contentとリクエストをする値css。それを機能させるために機能を備えたフックが必要な理由.

<link rel='stylesheet' type='text/css' href="<?php bloginfo( 'url' ); ?>/?my-custom-content=css" />

ここでやった。


ただし、外部関数でcssを使用する必要がある場合は、custom-css.phpを作成します。そしてfunctions.phpの中のあなたの関数はこのようになるでしょう:

add_action( 'parse_request', 'my_custom_wp_request' );
function my_custom_wp_request( $wp ) {
    if ( !empty( $_GET['my-custom-content'] ) && $_GET['my-custom-content'] == 'css' ) {
    # get theme options
       header( 'Content-Type: text/css' );
       require dirname( __FILE__ ) . '/css/custom-css.php';
       exit;
    }
}       

そしてあなたのcustom-css.phpの中

a {
  color: <?php echo get_option('some_other_option'); ?> !important;
} 

header.phpでは、上記と同じです。


検証と同様のアプローチ

検証データと私の同じようなアプローチ。このコードを追加するには、ファイルfunctions.phpテーマを使用するだけです。

/** Enqueue style for custom css
 *  we use parameter wpse_css and ( int ) 1 as value
 *
 */
add_action( 'wp_enqueue_scripts', 'wpse221867_enqueue_style', 99 );
function wpse221867_enqueue_style()
{
    /** check url ssl */
    $url = ( is_ssl() ) ?
            home_url( '/', 'https' ) : home_url( '/' );

    /** Register and enqueue wpse_style_php
     *  Build query with wpse_css as parameter, 1 as number to validation
     *
     */
    wp_register_style( 'wpse_style_php',
        add_query_arg( array(
            'wpse_css' => ( int ) 1
        ), $url ),
        array(), //your style handled
        null, //remove wp version
        'all' //media
    );
    wp_enqueue_style( 'wpse_style_php' );
}

/** Fire parse_request with function wpse221867_print_css
 *  Generate css in PHP
 *
 *  @return string CSS Content
 */
add_action( 'parse_request', 'wpse221867_print_css' );
function wpse221867_print_css()
{
    /** validate query on input */
    $css = filter_input( INPUT_GET, 'wpse_css', FILTER_VALIDATE_INT );

    if ( ! $css || ( int ) 1 != $css )
        return;

    ob_start();
    header( 'Content-type: text/css' );

    /** wpse_option_settings contain css in an array i.e
     *  array( 'wpse_css_content' => 'a{color:#ececec}' )
     *
     */
    $options = get_option( 'wpse_option_settings' );
    $raw_css = ( isset( $options['wpse_css_content'] ) )
                ? $options['wpse_css_content'] : '';

    /** sanitize for output */
    $content = wp_kses( $raw_css,
        array( '\'', '\"' )
    );
    $content = str_replace( '&gt;', '>', $content );
    echo $content; // output
    die();
}

私見、この方法は、特にパフォーマンスの問題のためにお勧めできません。静的CSSファイルを使用して、それをあなたのCSSをカスタマイズ可能にするための別の方法を見つけてください。 wp_add_inline_style (利用可能な例)および get_theme_mod

0
Jevuska