Obtener el enlace permanente dentro del bucle

19 may 2015, 06:00:09
Vistas: 16K
Votos: 2

Tengo un tema (basado en Roots/Sage) con una plantilla override home.php y en esa página estoy mostrando extractos e imágenes destacadas para cada publicación.

<?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; ?>

Parece relativamente simple y está funcionando, pero fue por prueba y error que llegué a generar el enlace mediante:

get_post_permalink(the_permalink())

Y dado que hay tantas formas incorrectas de hacer php (y wp), me encantaría recibir retroalimentación.

3
Comentarios

Usa simplemente <?php the_permalink(); ?>. Mostrará el enlace permanente.

Nilambar Sharma Nilambar Sharma
19 may 2015 07:50:02

Y también puedes usar <?php echo get_post_permalink() ?>.

Robert hue Robert hue
19 may 2015 08:26:09

Bueno, entonces al menos el mío está (estaba - ahora) haciendo dos llamadas a funciones donde solo se necesita una.

MikeiLL MikeiLL
19 may 2015 08:28:41
Todas las respuestas a la pregunta 2
0

Como se sugirió, fui a la referencia de funciones y desde allí al archivo fuente (ubicado en wp_includes/link-template.php) donde hay cuatro funciones que cada una devuelve resultados similares.

    <?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/

En este caso, como se trata de un tipo de entrada personalizado, la función que la documentación describe como diseñada para ello es get_post_permalink(), que, como la mayoría de las funciones get_*(), devuelve en lugar de mostrar un resultado, por lo que necesita ser usada con echo.

/**
 * Recupera el enlace permanente para una entrada de tipo personalizado.
 *
 * @since 3.0.0
 *
 * @param int $id Opcional. ID de la entrada.
 * @param bool $leavename Opcional, por defecto false. Si se debe mantener el nombre de la entrada.
 * @param bool $sample Opcional, por defecto false. Si es un enlace permanente de muestra.
 * @return string El enlace permanente de la entrada.
 */
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);
    }

    /**
     * Filtra el enlace permanente para una entrada de tipo personalizado.
     *
     * @since 3.0.0
     *
     * @param string  $post_link El enlace permanente de la entrada.
     * @param WP_Post $post      La entrada en cuestión.
     * @param bool    $leavename Si se debe mantener el nombre de la entrada.
     * @param bool    $sample    Si es un enlace permanente de muestra.
     */
    return apply_filters( 'post_type_link', $post_link, $post, $leavename, $sample );
}
19 may 2015 09:06:26
0

Como mencionó Nilambar, la función correcta es <?php the_permalink(); ?>.

Sin embargo, si estás usando el método de prueba y error, consulta el Codex de WordPress, especialmente la página sobre the_permalink para obtener más información, ejemplos y funciones relacionadas.

19 may 2015 08:33:53