Получить значение атрибута шорткода в другую функцию

Вопрос или проблема

Я пытаюсь получить значение атрибута шорткода в другой функции для добавления встроенного стиля. Я хочу использовать значение $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();

Как это работает:

  1. Инициализация шорткодов и стилей: Мы используем init для регистрации шорткодов и wp_enqueue_scripts для добавления стилей.

  2. Сохранение атрибутов шорткода: В методе renderShortcode мы извлекаем атрибуты шорткода и сохраняем цвет в свойство класса $color.

  3. Применение инлайн-стилей: Метод enqueueStyles проверяет, что свойство $color было установлено, после чего генерирует инлайн-стильc использованием wp_add_inline_style.

Обратите внимание, что в WordPress динамическое применение стилей важно структурировать таким образом, чтобы они были добавлены позже и в правильном порядке выполнения действий. Эта структура позволяет инкапсулировать изменения и правильно их применять на уровне шаблонов, обеспечивая целостность CSS.

Оцените материал
Добавить комментарий

Капча загружается...