it-swarm.com.ru

Отображение параметров темы в css

Я буквально выдергиваю свои волосы, пытаясь понять это. Я был на нем почти 12 часов.

Будучи новичком в PHP и ​​разработке тем, мне трудно понять, как отобразить theme_options('value'); при добавлении таблицы стилей PHP.

Я взял пример из блога, который я прочитал здесь используя метод 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

CSS настраивается путем манипулирования parse_query

@Scott Reinmuth , я думаю, вы ошиблись в этих уроках, да, вы используете parse_request метод.

Если вы следуете, этот код является хуком с функцией, и вам нужно поместить в 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 с этим кодом (без файла /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 theme, чтобы добавить этот код.

/** 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