Получение постоянной ссылки внутри цикла WordPress
У меня есть тема (на основе Roots/Sage) с переопределенным шаблоном home.php
, и на этой странице я вывожу анонсы и изображения для каждой записи.
<?php while (have_posts()) : the_post(); ?>
<div class=".container-fluid">
<?php if (get_post_type() == 'instruments') {?>
<div class="col-md-3">
<h1><?php the_ID(); ?></h1>
<a href="<?php get_post_permalink(the_permalink()) ?>"><?php the_post_thumbnail( 'medium' ); ?></a>
<?php get_template_part('templates/content', get_post_type() != 'post' ? get_post_type() : get_post_format()); ?>
</div>
</div>
<?php } ?>
<?php endwhile; ?>
Кажется относительно простым и работает, но я нашел способ генерации ссылки методом проб и ошибок:
get_post_permalink(the_permalink())
И поскольку существует много неправильных способов работы с php (и WordPress), я хотел бы получить обратную связь.

Как было предложено, я перешел к справочнику функций, а оттуда к исходному файлу (находится в wp_includes/link-template.php
), где есть четыре функции, каждая из которых возвращает схожие результаты.
<?php echo get_post_permalink() ?>
http://newdep.localhost/instruments/jester/
<?php echo post_permalink() ?>
http://newdep.localhost/instruments/jester/
<?php the_permalink() ?>
/instruments/jester/
<?php echo get_the_permalink() ?>
http://newdep.localhost/instruments/jester/
В данном случае, так как это произвольный тип записи, функция, которая, согласно документации, предназначена для этого - get_post_permalink()
. Как и большинство функций с префиксом get_*()
, она возвращает результат, а не выводит его, поэтому требует использования echo
.
/**
* Получает постоянную ссылку для записи произвольного типа.
*
* @since 3.0.0
*
* @param int $id Необязательный. ID записи.
* @param bool $leavename Необязательный, по умолчанию false. Оставлять ли название записи.
* @param bool $sample Необязательный, по умолчанию false. Является ли это примером постоянной ссылки.
* @return string Постоянная ссылка на запись.
*/
function get_post_permalink( $id = 0, $leavename = false, $sample = false ) {
global $wp_rewrite;
$post = get_post($id);
if ( is_wp_error( $post ) )
return $post;
$post_link = $wp_rewrite->get_extra_permastruct($post->post_type);
$slug = $post->post_name;
$draft_or_pending = isset( $post->post_status ) && in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft', 'future' ) );
$post_type = get_post_type_object($post->post_type);
if ( $post_type->hierarchical ) {
$slug = get_page_uri( $id );
}
if ( !empty($post_link) && ( !$draft_or_pending || $sample ) ) {
if ( ! $leavename ) {
$post_link = str_replace("%$post->post_type%", $slug, $post_link);
}
$post_link = home_url( user_trailingslashit($post_link) );
} else {
if ( $post_type->query_var && ( isset($post->post_status) && !$draft_or_pending ) )
$post_link = add_query_arg($post_type->query_var, $slug, '');
else
$post_link = add_query_arg(array('post_type' => $post->post_type, 'p' => $post->ID), '');
$post_link = home_url($post_link);
}
/**
* Фильтр постоянной ссылки для записи произвольного типа.
*
* @since 3.0.0
*
* @param string $post_link Постоянная ссылка записи.
* @param WP_Post $post Запись в вопросе.
* @param bool $leavename Оставлять ли название записи.
* @param bool $sample Является ли это примером постоянной ссылки.
*/
return apply_filters( 'post_type_link', $post_link, $post, $leavename, $sample );
}

Как упомянул Nilambar, правильной функцией является <?php the_permalink(); ?>
.
Однако, если вы используете метод проб и ошибок - попробуйте обратиться к WordPress Codex, в частности к разделу the_permalink
для получения дополнительной информации, примеров и связанных функций.
