Использование пользовательских полей в хуке фильтра

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

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

Шаги для интеграции пользовательских полей в фильтр

  1. Понимание функции get_post_meta(): Эта функция используется для получения пользовательских метаданных поста. В вашем случае вы хотите извлечь значение полей ‘original_blog_title’ и ‘original_url’.

  2. Правильная реализация фильтра: Ваша текущая функция apoth_readmore_link() имеет правильный замысел, но требует небольших доработок для корректного получения данных.

  3. Использование 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');

Объяснение изменений:

  1. Проверка объекта: Ваша проверка, является ли объект WP_Post, правильная. Это гарантирует, что мы работаем с постом.

  2. Получение метаданных: Мы извлекаем значения из двух полей: ‘original_blog_title’ и ‘original_url’. Это важно, так как оба поля нам нужны для формирования корректной ссылки.

  3. Проверка на пустоту: Прежде чем добавлять ссылку в контент, мы проверяем, не пусты ли значения. Это помогает избежать ситуации, когда на страницу добавляется пустая ссылка.

  4. Форматирование ссылки: Я использую esc_url() и esc_html() для экранирования данных, чтобы избежать возможных уязвимостей. Это лучшая практика в WordPress, гарантирующая, что ваш код безопасен.

Заключение

Теперь ваш фильтр будет корректно добавлять кнопку "Read More" в содержимое каждого поста, где есть соответствующие пользовательские метаданные. Эти изменения не только исправляют функциональность, но и делают ваш код более безопасным и надежным.

Если у вас есть дополнительные вопросы или потребности, не стесняйтесь обращаться за помощью!

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

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