Вопрос или проблема
Я пишу author.php и использую get_avatar() внутри оператора if в The Loop, но всё, что я получаю, это число. Думаю, это ID пользователя.
Вот мой код:
<?php if ( have_posts() ) : the_post(); ?>
<div class="contributor-card">
<?php esc_html( get_avatar( the_author_meta( 'ID' ), 96 ) ); ?>
<h1><?php esc_html( the_author_meta( 'display_name' ) ); ?></h1>
<p><?php esc_html( the_author_meta( 'description' ) ); ?></p>
<a class="button" href="<?php esc_url( the_author_meta( 'user_url' ) ) ?>">Website ›</a>
</div>
<?php rewind_posts(); while ( have_posts() ) : the_post();
Я уже пробовал присвоить ID автора переменной, но это все равно даёт мне число:
<div class="contributor-card">
<?php $author_id = the_author_meta( 'ID' ); ?>
<?php esc_html( get_avatar( $author_id, 96 ) ); ?>
<h1><?php esc_html( the_author_meta( 'display_name' ) ); ?></h1>
<p><?php esc_html( the_author_meta( 'description' ) ); ?></p>
<a class="button" href="<?php esc_url( the_author_meta( 'user_url' ) ) ?>">Website ›</a>
</div>
Ваш код в основном будет выдавать ошибки, например, отсутствие ; в конце
этот код, например
<?php esc_url( the_author_meta( 'user_url' ) ) ?>
правильный код должен быть
<?php echo esc_url( get_the_author_meta( 'user_url' ) ); ?>
или
<?php the_author_meta( 'user_url' ); ?>
Почему появляется номер ID автора?
Число, которое появляется, выше, это номер ID пользователя, почему оно появляется? Потому что оно используется в строке ($):
<?php $author_id = the_author_meta( 'ID' ); ?>
Если вы хотите определить ID автора в строке ($), то используйте get_, например, вот так:
<?php $author_id = get_the_author_meta( 'ID' ); ?>
Обратите внимание, что приведенный выше код только генерирует номер ID пользователя.
нет вывода для вызова функции аватара
<?php $author_id = the_author_meta( 'ID' ); ?>
<?php esc_html( get_avatar( $author_id, 96 ) ); ?>
код для вызова функции аватара должен быть
<?php $author_id = get_the_author_meta( 'ID' ); ?>
<?php echo get_avatar( $author_id, 96 ); ?>
Это сделает аватар видимым.
esc_html() используется только в определенных кодах, например, строках, полученных от параметров, введенных пользователями
В вашем случае вызов аватара не требует использования esc_html()
Функции WordPress с префиксом get_ или напрямую префикс the_, чтобы вызвать функцию get_, нужно использовать echo, в то время как the_ обычно без echo, поэтому, когда вы помещаете the_author_meta(‘ID); в строку, она будет немедленно выполнена.
пример get_
<a class="button" href="<?php echo esc_url( get_the_author_meta( 'user_url' ) ); ?>">Website ›</a>
пример the_
<a class="button" href="<?php the_author_meta( 'user_url' ); ?>">Website ›</a>
Результат кода
<div class="contributor-card">
<?php echo get_avatar( get_the_author_meta( 'ID' ), 96 ); ?>
<h1><?php esc_html( the_author_meta( 'display_name' ) ); ?></h1>
<p><?php esc_html( the_author_meta( 'description' ) ); ?></p>
<a class="button" href="<?php echo esc_url( get_the_author_meta( 'user_url' ) ) ?>">Website ›</a>
</div>
или если вы хотите использовать ID автора для конкретной цели
<?php $author_id = get_the_author_meta( 'ID' ); ?>
<?php esc_html( get_avatar( $author_id, 96 ) ); ?>
<h1><?php esc_html( the_author_meta( 'display_name' ) ); ?></h1>
<p><?php esc_html( the_author_meta( 'description' ) ); ?></p>
<a class="button" href="<?php echo esc_url( get_the_author_meta( 'user_url' ) ); ?>">Website ›</a>
</div>
Вы вызываете esc_html()
в нескольких местах в вашем коде, но вы не делаете ничего с возвращаемым значением esc_html()
.
esc_html()
ничего не выводит на экран; вам нужно сделать, например, echo esc_html( $some_value );
для этого. Однако, я также не думаю, что вам нужно использовать esc_html()
в данном случае, потому что esc_html()
изменит <img alt="[alt]" src="https://wordpress.stackexchange.com/questions/428156/[avatar URL]">
на <img alt="[alt]" src="https://wordpress.stackexchange.com/questions/428156/[avatar URL]">
.
Напротив, the_author_meta()
делает вывод на экран, из-за чего, возможно, вы видите число в неожиданном месте. Используйте get_the_author_meta()
для получения, но не вывода данных.
Что-то вроде этого:
<?php if ( have_posts() ) : the_post(); ?>
<div class="contributor-card">
<?php echo get_avatar( get_the_author_meta( 'ID' ), 96 ); ?>
<h1><?php the_author_meta( 'display_name' ); ?></h1>
<p><?php the_author_meta( 'description' ); ?></p>
<a class="button" href="<?php the_author_meta( 'user_url' ); ?>">Website ›</a>
</div>
<?php rewind_posts(); while ( have_posts() ) : the_post();
…это, вероятно, то, что вы ищете.
.
Ответ или решение
При разработке веб-приложений на WordPress иногда возникают проблемы, которые на первый взгляд кажутся загадочными, но на самом деле имеют простое объяснение и решение. Рассмотрим ситуацию, когда функция get_avatar()
возвращает вместо ожидаемого HTML-кода изображения аватара просто число, и разберем, как можно исправить эту проблему.
Теория
В первую очередь, необходимо понять, как работают функции WordPress, такие как the_author_meta()
и get_the_author_meta()
. Эти функции предназначены для работы с метаданными автора. Важно различать их функциональность:
-
the_author_meta()
— выводит значение метаданных автора непосредственно на экран. Это значит, что при вызовеthe_author_meta( 'ID' )
это значение будет немедленно отображено на странице. -
get_the_author_meta()
— извлекает значение метаданных и возвращает его, но не выводит непосредственно на экран. Это позволяет использовать значение для дальнейшей обработки или вывода, такими, например, функциями какecho
.
Пример
Теперь давайте применим наш теоретический анализ. В приведенном вами коде проблема заключалась в том, что:
<?php esc_html( get_avatar( the_author_meta( 'ID' ), 96 ) ); ?>
Здесь the_author_meta( 'ID' )
сразу выводит ID пользователя на страницу, так как вы используете эту функцию внутри вызова get_avatar()
. Вместо этого вы должны использовать get_the_author_meta( 'ID' )
, чтобы просто получить ID без его немедленного вывода.
Применение
Вот как правильно использовать функции для получения аватара, отображения имени, описания и URL сайта автора:
<?php if ( have_posts() ) : the_post(); ?>
<div class="contributor-card">
<?php
// Получаем ID автора без вывода на экран
$author_id = get_the_author_meta( 'ID' );
// Корректное использование get_avatar для генерации HTML-изображения
echo get_avatar( $author_id, 96 );
?>
<h1><?php echo esc_html( get_the_author_meta( 'display_name' ) ); ?></h1>
<p><?php echo esc_html( get_the_author_meta( 'description' ) ); ?></p>
<a class="button" href="<?php echo esc_url( get_the_author_meta( 'user_url' ) ); ?>">Website ›</a>
</div>
<?php rewind_posts(); while ( have_posts() ) : the_post(); ?>
Разъяснение
В данном коде мы:
-
Используем
get_the_author_meta()
вместоthe_author_meta()
: Это позволяет извлечь значение без немедленного вывода. Такое изменение коррелирует с безопасным и правильным использованием данных. -
Используем
echo
вместе сesc_html()
иesc_url()
для безопасного вывода данных: Эти функции защищают ваш сайт от потенциально опасных данных, введенных пользователем, и гарантируют, что они будут правильно экранированы.
Почему это важно
Правильное использование функций get_the_author_meta()
и the_author_meta()
не только обеспечивает корректность отображения вашего сайта, но и играет важную роль в безопасности. WordPress предоставляет мощные инструменты для манипуляции и вывода данных, и грамотное их использование критично для разработки профессиональных веб-приложений.
Таким образом, если вы заметили, что функция get_avatar()
возвращает неожиданный результат, важно проанализировать используемые вами функции на предмет их функциональности: выводят они данные на экран или возвращают для дальнейшего использования. Этот простой, но мощный анализ позволяет решать многие аналогичные проблемы и развивать более глубокое понимание принципов работы WordPress.
Такой подход позволяет не только успешно решать проблемы, но и вести более безопасную и качественную разработку с использованием WordPress.