Вопрос или проблема
Привет, я пытаюсь добавить динамические теги в виджет “image” в WordPress, чтобы у меня была возможность выбирать пользовательские изображения: второе основное изображение и третье основное изображение. Эти второе и третье изображения работают, я создал для них пользовательский код, и если я извлекаю их с помощью обычного кода, то вижу, что они появляются, значит, они сохраняются в базе данных.
У меня почти всё работает, но самое важное, отображение изображения на фронтенде не работает.
Я создал папку с названием: custom-efi-dynamic-tags в папке плагина. В этой папке я создал файл с названием custom-efi-dynamic-tags.php и папку включает, где находится код моего второго тега в файле: class-second-featured-image-tag.php
Мне интересно, почему изображение не загружается.
Я пробовал разные коды и читал документацию Elementor по этой теме, но каким-то образом не могу получить изображения.
<?php
/**
* Plugin Name: Custom EFI Dynamic Tags
* Description: Adds custom dynamic tags for Elementor for second and third featured images.
* Version: 1.0.0
* Author: Your Name
* Text Domain: custom-efi-dynamic-tag
*/
namespace Custom_Efi_Dynamic_Tag;
use Elementor\Plugin;
use Elementor\Core\DynamicTags\Tag;
class Efi_Plugin {
private static $_instance = null;
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function __construct() {
add_action( 'init', array( $this, 'init' ) );
}
public function init() {
add_action( 'elementor/dynamic_tags/register_tags', [ $this, 'register_dynamic_tags' ] );
}
public function register_dynamic_tags( $dynamic_tags ) {
error_log('Registering dynamic tags...');
\Elementor\Plugin::$instance->dynamic_tags->register_group( 'custom-dynamic-tags', [
'title' => 'My Custom Dynamic Tags'
]);
include_once( plugin_dir_path( __FILE__ ) . 'includes/class-second-featured-image-tag.php' );
include_once( plugin_dir_path( __FILE__ ) . 'includes/class-third-featured-image-tag.php' );
$dynamic_tags->register_tag( 'Custom_Efi_Dynamic_Tag\Second_Featured_Image_Tag' );
$dynamic_tags->register_tag( 'Custom_Efi_Dynamic_Tag\Third_Featured_Image_Tag' );
error_log('Dynamic tags registered.');
}
}
if ( ! function_exists( 'Plugin' ) ) {
function Efi_Plugin() {
return Efi_Plugin::instance();
}
}
Efi_Plugin();
и мой второй тег выглядит так:
<?php
namespace Custom_Efi_Dynamic_Tag;
use Elementor\Core\DynamicTags\Tag;
use Elementor\Modules\DynamicTags\Module;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Second_Featured_Image_Tag extends Tag {
public function get_name() {
return 'second-featured-image';
}
public function get_title() {
return __( 'Second Featured Image', 'custom-efi-dynamic-tag' );
}
public function get_group() {
return 'custom-dynamic-tags';
}
public function get_categories() {
return [ Module::IMAGE_CATEGORY ];
}
protected function register_controls() {
// Никаких дополнительных элементов управления для этого динамического тега не требуется.
}
public function render() {
$second_featured_image_url = get_post_meta( get_the_ID(), '_second_featured_image', true );
if ( empty( $second_featured_image_url ) ) {
error_log('No URL found for second featured image.');
return;
}
error_log('Rendering image: ' . $second_featured_image_url);
echo '<img src="' . esc_url( $second_featured_image_url ) . '" alt="' . esc_attr__( 'Second Featured Image', 'custom-efi-dynamic-tag' ) . '">';
}
}
Чего мне не хватает, если изображения не отображаются, если я выбираю их из динамического тега?
Заранее спасибо.
public function get_content( array $options = [] ) {
$post_id = $this->get_settings('post_id');
if (!$post_id) {
return 'Post ID nije pronađen.';
}
$custom_shop_image_id = get_post_meta($post_id, '_custom_shop_image_id', true);
if (!$custom_shop_image_id) {
return 'Meta ključ `_custom_shop_image_id` nije pronađen ili je prazan.';
}
$custom_shop_image = wp_get_attachment_image_src($custom_shop_image_id, 'woocommerce_thumbnail');
if (!$custom_shop_image) {
return 'Nije pronađena slika za attachment ID: ' . esc_html($custom_shop_image_id);
}
return [
'id' => $custom_shop_image_id,
'url' => esc_url($custom_shop_image[0]),
'alt' => 'Custom Shop Image'
];
}
используйте get_content для получения изображений
Ответ или решение
Проблема, с которой вы столкнулись при настройке пользовательского динамического тега в Elementor для отображения изображения в WordPress, требует комплексного подхода, включающего анализ кода и настройки WordPress. Давайте разберемся, что может быть причиной того, что изображение не отображается на фронтенде.
Теория
Прежде всего, важно понять, как работает механизм динамических тегов в Elementor. Динамические теги позволяют извлекать динамическое содержимое (такие как данные из Meta полей) и использовать его в виджетах. Для этого необходимо правильно зарегистрировать теги, чтобы они были доступны через интерфейс Elementor.
Наиболее вероятные причины, по которым изображение может не отображаться, включают:
- Неправильное извлечение данных из базы данных. В таких случаях метаданные могут не передаваться в Elementor, что препятствует отображению изображения.
- Ошибки в синтаксисе или логике кода, которые могут вызывать неисправности.
- Отсутствие или некорректные настройки пользовательских фильтров и хуков.
Пример
Рассмотрим ваш код. Вы создали плагин и зарегистрировали динамические теги. Код, который вы используете для регистрация тега, выглядит корректным. Однако ошибка может скрываться именно в функции извлечения и отображения изображения. Вот основные моменты, на которые стоит обратить внимание:
- Правильное извлечение метаданного:
Вы используете функцию get_post_meta
для получения URL изображения. Однако убедитесь, что ключ _second_featured_image
действительно хранит правильный URL изображения, а не просто идентификатор вложения. Если метаданные содержат ID, вам нужно использовать wp_get_attachment_image_src
для получения URL.
- Использование функции рендеринга:
В методе render
вы пытаетесь эхоизировать HTML-код для изображения. Убедитесь, что URL, который вы получаете из базы данных, валиден. Добавьте больше логов для дебаггинга, чтобы убедиться, что вы получаете данные, которые ожидаете.
Применение
Чтобы исправить ситуацию, следуйте следующему плану:
-
Проверка метаданных
Убедитесь, что данные сохраняются правильно. Используйте админ-панель или WP-CLI, чтобы убедиться, что метаданные сохранены корректно. Если в поле сохраняется не URL, а ID файла, измените код на использование функции
wp_get_attachment_image_src
. -
Отладка и тестирование
Добавьте дополнительные
error_log
в функциюrender
, чтобы получить больше информации о том, какие данные приходят изget_post_meta
. Например:error_log('Meta data: ' . print_r(get_post_meta(get_the_ID(), '_second_featured_image', true), true));
-
Использование методов класса для получения изображения
Как указано в вашем вопросе, метод
get_content
может быть использован для получения изображений. Поэкспериментируйте с его использованием, чтобы вернуть массив с данными о изображении, вместо того чтобы напрямую выводить HTML-код вrender
. -
Автономное тестирование
Убедитесь, что ваш пользовательский код по поиску и отображению изображений работает вне контекста Elementor. Это поможет выявить, лежит ли проблема в вашей логике или в интеграции с Elementor.
-
Проверка сторонних конфликтов
Деактивируйте другие плагины и проверьте, изменяется ли поведение. Возможно, другой плагин или тема WordPress вмешивается в ваш код.
Заключение
Проблемы, связанные с отображением пользовательских динамических тегов в Elementor, могут быть вызваны рядом факторов. Ваша задача – тщательно проверить все возможные источники ошибки, от правильности кода до верного извлечения и отображения данных, и устранить их последовательно. Анализ и логирование ваших шагов помогут вам в этом процессе и ускорят поиск решения. Если стимулирующие мероприятия не приводят к должным результатам, рассмотрите возможность обращения в поддержку Elementor или найма опытного разработчика для решения задачи.