Вопрос или проблема
Я пытаюсь получить значение атрибута шорткода в другой функции для добавления встроенного стиля. Я хочу использовать значение $color
в другой функции.
Вот мой код
<?php
/**
*
*/
class MakeShortcode
{
public $color;
public function __construct()
{
add_action( 'init', array($this, 'PostBLock') );
add_shortcode( 'PostBLock', array($this, 'getpostblock') );
add_action( 'wp_enqueue_scripts', array( $this, 'inlinestyle') );
}
public function getpostblock( $atts ){
extract( shortcode_atts(
array(
'section_color' => '#000000',
), $atts) );
$this->color = $section_color;
$output="First LIne";
$output .= 'Second Line';
return $output;
}
public function inlinestyle(){
wp_enqueue_style(
'custom-style',
get_template_directory_uri() . '/css/style.css'
);
$custom_css = "
div[data-id=289374].post-block-post-left.active,
div[data-id=289374].post-block-post-right.active{
background : {$this->color};
border-color : {$this->color};
}";
wp_add_inline_style( 'custom-style', $custom_css );
}
}
$test = new MakeShortcode();
Но background
и border-color
остаются пустыми. Это значит, что я не получаю значение $this->color
в этой функции. Как я могу это исправить?
<?php
class MakeShortcode
{
public $color;
public function __construct()
{
add_action( 'init', array($this, 'PostBLock') );
add_shortcode( 'PostBLock', array($this, 'getpostblock') );
add_action( 'wp_enqueue_scripts', array( $this, 'inlinestyle') );
}
public function getpostblock( $atts ){
extract( shortcode_atts(
array(
'section_color' => '#000000',
), $atts) );
return $section_color;
}
public function inlinestyle(){
$color = $this->getpostblock();
wp_enqueue_style(
'custom-style',
get_template_directory_uri() . '/css/style.css'
);
$custom_css = "
div[data-id=289374].post-block-post-left.active,
div[data-id=289374].post-block-post-right.active{
background : {$color};
border-color : {$color};
}";
wp_add_inline_style( 'custom-style', $custom_css );
}
}
$test = new MakeShortcode();
Ответ или решение
Конечно, решение вашей задачи может потребовать немного гибкости в понимании того, как WordPress обрабатывает шорткоды и выполняет функции. Давайте рассмотрим, как вы можете передавать значение атрибута шорткода в другую функцию для добавления инлайн-стиля.
Проблема:
Вы используете атрибут $color
в шорткоде, но не можете правильно его передать в функцию inlinestyle
. Это происходит потому, что обработка шорткодов не сохраняет атрибуты после исполнения через объектные свойства, если они не вызываются напрямую.
Возможное решение:
Основная идея заключается в том, чтобы сохранить полученное значение цвета в таком месте, чтобы оно было доступно другим действиям или фильтрам в WordPress. В этом случае можно использовать глобальную переменную для хранения цвета.
Реализация:
<?php
class MakeShortcode {
public $color;
public function __construct() {
add_action('init', array($this, 'registerShortcode'));
add_action('wp_enqueue_scripts', array($this, 'enqueueStyles'));
}
// Регистрация шорткода
public function registerShortcode() {
add_shortcode('PostBLock', array($this, 'renderShortcode'));
}
// Обработка шорткода и сохранение значения цвета
public function renderShortcode($atts) {
$atts = shortcode_atts(array(
'section_color' => '#000000'
), $atts);
// Сохраняем выбранный цвет в свойство класса
$this->color = $atts['section_color'];
return "First Line\nSecond Line";
}
// Добавление инлайн-стиля с использованием сохраненного цвета
public function enqueueStyles() {
// Здесь важно проверить наличие задания цвета прежде чем использовать его
if (isset($this->color)) {
$custom_css = "
div[data-id=289374].post-block-post-left.active,
div[data-id=289374].post-block-post-right.active {
background: {$this->color};
border-color: {$this->color};
}";
wp_enqueue_style('custom-style', get_template_directory_uri() . '/css/style.css');
wp_add_inline_style('custom-style', $custom_css);
}
}
}
$test = new MakeShortcode();
Как это работает:
-
Инициализация шорткодов и стилей: Мы используем
init
для регистрации шорткодов иwp_enqueue_scripts
для добавления стилей. -
Сохранение атрибутов шорткода: В методе
renderShortcode
мы извлекаем атрибуты шорткода и сохраняем цвет в свойство класса$color
. -
Применение инлайн-стилей: Метод
enqueueStyles
проверяет, что свойство$color
было установлено, после чего генерирует инлайн-стильc использованиемwp_add_inline_style
.
Обратите внимание, что в WordPress динамическое применение стилей важно структурировать таким образом, чтобы они были добавлены позже и в правильном порядке выполнения действий. Эта структура позволяет инкапсулировать изменения и правильно их применять на уровне шаблонов, обеспечивая целостность CSS.