Вопрос или проблема
Я хотел бы добавить некоторый код из файла темы единственного поста в фильтр, но я не совсем уверен, как это сделать, так как он включает функцию get_post_meta(). Я искал, но не могу понять, как это сделать.
Код в файле темы single-post.php
:
$apoth_original_title = get_post_meta( get_the_ID(), 'original_blog_title', true);
$apoth_original_url = get_post_meta( get_the_ID(), 'original_url', true);
?>
<a id="apoth_readmore" class="w-btn style_solid size_medium color_primary icon_none" href="https://wordpress.stackexchange.com/questions/246324/<?php echo $apoth_original_url?>"><span class="w-btn-label">Читать далее на <em><?php echo $apoth_original_title ?></em></span></a>
<?php
Попытка фильтра в functions.php
:
function apoth_readmore_link( $content ) {
if( is_single() ) {
$content .= '<a href="' . get_post_meta(get_the_ID(), 'original_url', true) . '"> Читать далее</a>' ;
}
return $content;
}
add_filter('the_content', 'apoth_readmore_link' )
Я понимаю, что это не работает, потому что get_post_meta()
не выводит данные пользовательского поля, но я не знаю, как присвоить это переменной и потом вывести в контексте функции фильтра. Или, возможно, есть какой-то другой способ сделать это, который я упускаю?
Попробуйте get_queried_object()
, чтобы сослаться на WP_Post
, который создал страницу.
- если вы находитесь на странице единственного поста, он вернёт объект поста
- если вы находитесь на странице, он вернёт объект страницы
- если вы находитесь на архивной странице, он вернёт объект типа поста
- если вы находитесь на архиве категории, он вернёт объект категории
- если вы находитесь на архиве автора, он вернёт объект автора
- и т.д.
function apoth_readmore_link( $content ) {
$post = get_queried_object();
if ( get_class($post)==='WP_Post' ) {
$url = get_post_meta($post->ID, 'original_url', true);
$content .= sprintf( '<a href="https://wordpress.stackexchange.com/questions/246324/%s">Читать далее</a>', $url, $url );
}
return $content;
}
add_filter('the_content', 'apoth_readmore_link' );
Ответ или решение
При использовании пользовательских полей в хук-фильтре WordPress важно правильно учитывать контекст, чтобы получить нужные данные и правильно их отобразить. Рассмотрим вашу задачу, в которой вам необходимо интегрировать данные из пользовательских полей в функцию фильтра, применяемую к содержимому поста.
Шаги для интеграции пользовательских полей в фильтр
-
Понимание функции
get_post_meta()
: Эта функция используется для получения пользовательских метаданных поста. В вашем случае вы хотите извлечь значение полей ‘original_blog_title’ и ‘original_url’. -
Правильная реализация фильтра: Ваша текущая функция
apoth_readmore_link()
имеет правильный замысел, но требует небольших доработок для корректного получения данных. -
Использование
get_queried_object()
: Это отличный подход, так как он возвращает объект текущего поста, что важно для работы с метадаными.
Давайте размотим вашу функцию и добавим нужные исправления:
function apoth_readmore_link( $content ) {
// Получаем текущий объект поста
$post = get_queried_object();
// Проверяем, что это действительно объект WP_Post
if ( get_class($post) === 'WP_Post' ) {
// Получаем значения пользовательских полей
$original_title = get_post_meta($post->ID, 'original_blog_title', true);
$original_url = get_post_meta($post->ID, 'original_url', true);
// Проверяем, есть ли данные, чтобы избежать пустого контента
if ( !empty($original_url) && !empty($original_title) ) {
// Формируем ссылку и добавляем её в содержимое
$content .= sprintf(
'<a id="apoth_readmore" class="w-btn style_solid size_medium color_primary icon_none" href="%s">Read More at <em>%s</em></a>',
esc_url($original_url),
esc_html($original_title)
);
}
}
return $content;
}
add_filter('the_content', 'apoth_readmore_link');
Объяснение изменений:
-
Проверка объекта: Ваша проверка, является ли объект
WP_Post
, правильная. Это гарантирует, что мы работаем с постом. -
Получение метаданных: Мы извлекаем значения из двух полей: ‘original_blog_title’ и ‘original_url’. Это важно, так как оба поля нам нужны для формирования корректной ссылки.
-
Проверка на пустоту: Прежде чем добавлять ссылку в контент, мы проверяем, не пусты ли значения. Это помогает избежать ситуации, когда на страницу добавляется пустая ссылка.
-
Форматирование ссылки: Я использую
esc_url()
иesc_html()
для экранирования данных, чтобы избежать возможных уязвимостей. Это лучшая практика в WordPress, гарантирующая, что ваш код безопасен.
Заключение
Теперь ваш фильтр будет корректно добавлять кнопку "Read More" в содержимое каждого поста, где есть соответствующие пользовательские метаданные. Эти изменения не только исправляют функциональность, но и делают ваш код более безопасным и надежным.
Если у вас есть дополнительные вопросы или потребности, не стесняйтесь обращаться за помощью!