Llamando a the_excerpt desde un archivo de plantilla de plugin en WordPress
Estoy intentando usar the_excerpt desde un archivo de plantilla de un plugin, el plugin es wp-favorite-posts. Por defecto el plugin solo muestra el título de los posts guardados, he logrado hacer que muestre todo, términos de taxonomía, imágenes etc. pero tengo problemas con the_excerpt. Cuando añado <?php the_excerpt( $post_id ); ?>
al código, ocurre un bucle continuo del post favorito y no se muestra el extracto.
Estoy usando global $post
para poder obtener toda la información (excepto el extracto)
<?php
global $post;
if (!empty($user)):
if (!wpfp_is_user_favlist_public($user)):
echo "Posts favoritos de $user.";
else:
echo "La lista de $user no es pública.";
endif;
endif;
if ($wpfp_before):
echo "<p>".$wpfp_before."</p>";
endif;
if ($favorite_post_ids):
foreach ($favorite_post_ids as $post_id) {
$p = get_post($post_id); ?>
<div class="homepage_props">
<div class="homepage_props_inner">
<div class="homepage_propsbanner">
<div class="homepage_new">
<?php if (strtotime($post->post_date) > strtotime('-7 days')) { ?>
<img src="<?php echo get_template_directory_uri(); ?>/images/new.png" alt="últimos listados de propiedades" title="propiedades recientes" />
<?php } ?>
</div>
<h2>
<span style="float:left; font-weight:bold;">
<?php
if ( 'sales' == get_post_type($post_id) ) {
echo 'Propiedad en Venta';
} elseif ( 'rentals' == get_post_type($post_id) ) {
echo 'Propiedad en Alquiler';
} elseif ( 'business' == get_post_type($post_id) ) {
echo 'Negocio en Venta</span>';
} elseif ( 'bandb' == get_post_type() ) {
echo 'Bed And Breakfast</span>';
}
?>
</span>
<span style="float:right; font-weight:normal;">
<a href="<?php echo get_permalink($post_id); ?>" title="<?php printf( esc_attr__( 'Enlace permanente a %s', 'themename' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php echo get_the_title ( $post_id ); ?></a>
</span>
</h2>
</div>
<div class="clear"></div>
<div class="homepage_props_image">
<?php
echo "<a href='".get_permalink($post_id)."'>";
echo get_the_post_thumbnail ( $post_id, 'medium' );
echo "</a>";
?>
</div><!-- / homepage_props_image -->
<div class="homepage_props_info hyphenate">
<!-- aquí es donde estoy intentando poner the_excerpt -->
</div><!-- / homepage_props_info -->
<div class="clear"></div>
<div class="homepage_props_tax">
<?php
if ( 'sales' == get_post_type($post_id) ) {
echo '<h3><span style="float:right; font-weight:normal;">' . get_the_term_list( $post_id, 'property_type', 'Tipo de Propiedad: ', ' ', '' ),' ' . get_the_term_list( $post_id, 'location', 'Ubicación: ', ' ', '' ),' '.get_the_term_list( $post_id, 'region', 'Región: ', ' ', '' );
} elseif ( 'rentals' == get_post_type($post_id) ) {
echo '<h3><span style="float:right; font-weight:normal;">' . get_the_term_list( $post_id, 'property_type', 'Tipo de Propiedad: ', ' ', '' ),' ' . get_the_term_list( $post_id, 'location', 'Ubicación: ', ' ', '' ),' ' . get_the_term_list( $post_id, 'region', 'Región: ', ' ', '' );
} elseif ( 'business' == get_post_type($post_id) ) {
echo '<h3><span style="float:right; font-weight:normal;">' . get_the_term_list( $post_id, 'property_type', 'Tipo de Propiedad: ', ' ', '' ),' ' . get_the_term_list( $post_id, 'location', 'Ubicación: ', ' ', '' ),' ' . get_the_term_list( $post_id, 'region', 'Región: ', ' ', '' );
}
?>
</span></h3>
</div><!-- / homepage_props_tax -->
</div><!-- / homepage_props_inner -->
</div><!-- / homepage_props -->
<?php
}
else:
echo $wpfp_options['favorites_empty'];
endif; ?>
<span style="float:left; font-size:0.7em;"><?php wpfp_clear_list_link(); ?></span>
<?php wpfp_cookie_warning(); ?>
Primera imagen es usando the_excerpt
Segunda imagen es sin the_excerpt

Estás cometiendo algunos errores:
- the_excerpt no utiliza el ID del post.
- Cuando modificas el global $post siempre deberías restablecerlo a su valor original.
- Estabas asignando el valor de retorno de get_post a $p que no se utilizaba en tu código.
He hecho algunas correcciones en tu código. El siguiente código es solo una copia pega de tu código con mis correcciones, así que prueba el código de abajo y déjame saber si aún tienes problemas. Perdón que tuve que cambiar un poco el formato de tu código.
<?php
if (!empty($user)):
if (!wpfp_is_user_favlist_public($user)):
echo "Posts favoritos de $user.";
else:
echo "La lista de $user no es pública.";
endif;
endif;
if ($wpfp_before):
echo "<p>".$wpfp_before."</p>";
endif;
if ($favorite_post_ids):
foreach ($favorite_post_ids as $post_id) {
$p = get_post($post_id);
?>
<div class="homepage_props">
<div class="homepage_props_inner">
<div class="homepage_propsbanner">
<div class="homepage_new">
<?php if (strtotime($p->post_date) > strtotime('-7 days')) { ?>
<img src="<?php echo get_template_directory_uri(); ?>/images/new.png" alt="últimos listados de propiedades" title="Nuevas propiedades" />
<?php } ?>
</div>
<h2><span style="float:left; font-weight:bold;">
<?php
if ( 'sales' == $p->post_type ) {
echo 'Propiedad en Venta';
} elseif ( 'rentals' == $p->post_type ) {
echo 'Propiedad en Alquiler';
} elseif ( 'business' == $p->post_type ) {
echo 'Negocio en Venta';
} elseif ( 'bandb' == $p->post_type ) {
echo 'Cama y Desayuno';
}
?>
</span>
<span style="float:right; font-weight:normal;">
<a href="<?php echo get_permalink($post_id); ?>" title="<?php printf( esc_attr__( 'Enlace permanente a %s', 'themename' ), get_the_title( $post_id ) ); ?>" rel="bookmark"><?php echo get_the_title ( $post_id ); ?></a>
</span>
</h2>
</div>
<div class="clear"></div>
<div class="homepage_props_image">
<?php
echo "<a href='".get_permalink($post_id)."'>";
echo get_the_post_thumbnail ( $post_id, 'medium' );
echo "</a>";
?>
</div><!-- / homepage_props_image -->
<div class="homepage_props_info hyphenate">
<?php echo $p->post_excerpt; ?>
</div><!-- / homepage_props_info -->
<div class="clear"></div>
<div class="homepage_props_tax">
<?php
if ( in_array( $p->post_type, array( 'sales', 'rentals', 'business' ) ) ) {
echo '<h3><span style="float:right; font-weight:normal;">' .get_the_term_list( $post_id, 'property_type', 'Tipo de Propiedad: ', ' ', '' ),' ' .get_the_term_list( $post_id, 'location', 'Ubicación: ', ' ', '' ),' '.get_the_term_list( $post_id, 'region', 'Región: ', ' ', '' );
echo '</span></h3>';
}
?>
</div><!-- / homepage_props_tax -->

Gracias Hameedullah por tomarte el tiempo de ayudar, he probado el código que proporcionaste y sigue ocurriendo lo mismo, he editado mi publicación inicial para mostrar el error, la primera imagen muestra lo que sucede cuando the_excerpt está incluido en el código y la segunda imagen muestra cómo se ve cuando el extracto no está en el código, tanto tu forma como la mía dan el mismo error... saludos

@Martin, he modificado el código en mi respuesta para usar $post->post_excerpt
en lugar de the_excerpt
, ¿puedes probarlo para estar seguro?

@Hameedullah gracias, eso ha detenido el bucle que se muestra en las imágenes anteriores, pero solo ha dejado el css y no muestra ninguno de los valores como: miniatura, títulos, extracto, etc.

@Martin, ¿Qué quieres decir con que dejó el css? ¿El formato está roto o algo más? Puedes probar echo strip_tags( $post->post_excerpt );

@Hameedullah al decir que solo dejó el css, quizás debería haber sido más claro y decir que deja mi html renderizado en la página como debería ser pero ninguna de las dinámicas (texto y miniatura) están siendo llamadas, así que básicamente me queda un div vacío pero con estilos. El último fragmento de código que proporcionaste arriba tampoco obtiene ninguna salida via php en absoluto.. lo siento por el tiempo que estás dedicando a esto, pero es apreciado.. estoy completamente perdido sobre cómo solucionarlo para ser honesto

@Martin revisa el nuevo código actualizado. He hecho algo más de limpieza. Y ya no tienes que modificar la variable global $post.

excelente... ahora está devolviendo los datos como debería, pero solo si se usa la tabla post_excerpt en wp-admin no se devuelve nada si esta tabla está vacía, pero puedo hacer algo al respecto agregándolo a mis parámetros de publicación (publicando desde el front) desde el contenido de las publicaciones y reduciendo la longitud... Muchísimas gracias por tu tiempo en este Hameedullah, es muy apreciado.
