2012-05-02 11 views
8

Me consta que probablemente sea un problema de devolución. Así que dividí el contenido, uno en una función llamada thelist y el otro es una función real que lo devuelve. El código sigue la pregunta.Código corto que aparece en la parte superior del contenido en lugar de en el lugar donde lo necesito

El shortcode real funciona, excepto que el contenido aparece en la parte superior antes que el resto del contenido. Pensé que el retorno now_include_post lo arreglaría, pero no es así. ¿Alguien puede ayudar?

function thelist() { 
if (have_posts()) : while (have_posts()) : the_post(); 
?> 
     <div id="post-<?php the_ID(); ?>" <?php post_class('thumb'); ?>> 
      <a href="<?php the_permalink() ?>" class="thumb-link"> 
      <?php 
    if (!post_password_required()) { 
        if (has_post_thumbnail()) { 
         the_post_thumbnail(); 
        } 
       } else { 
        ?> 
        <img src="<?php bloginfo('template_url') ?>/img/locked.png" /> 
     <?php } ?> 
      </a> 
      <h2> 
       <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a> 
      </h2> 
     </div> 
<?php /* end post */ ?> 
<?php 
    endwhile; 
    endif; 
    wp_reset_query(); 
    } 
    ?> 
    <?php 

function now_include_post($atts) { 
$thepostid = intval($atts[id]); 
query_posts("p=$thepostid"); 
$output .= thelist(); 
return $output; 
} 

Respuesta

24

Desea devolver todo el texto en lugar de hacerlo en ese momento cuando está escapando de PHP.

Al comienzo de su lalista() la función se inicia un búfer de salida con

ob_start(); 

Luego, al final cerrar este búfer y regresar su contenido con

return ob_get_clean(); 

que devolverá el contenido en lugar de echo de inmediato, que es lo que desea hacer en el caso de un código corto de WP

PHP information on Output Buffering Functions

+1

Eso es realmente excepcional. ¡Muchas gracias por su ayuda y ese enlace! – user1368968

+0

Es 2014 y después de 2 años tu respuesta sálvame :) ¡Gracias! –

+0

Funciona para mí. Gracias –

-1

Tengo este código breve y aparece siempre en la parte superior de la página aunque coloque el código breve al final del contenido de la página (en wordpress), cualquier sugerencia, por favor.

function ss_framework_services_sc($atts, $content = null) { 

extract(shortcode_atts(array('id' => ''), $atts)); 

global $post; 

    $args = array( 'name' => esc_attr($id), 
        'post_type' => 'services', 
        'posts_per_page' => '1' 

       ); 

    query_posts($args); 


if(have_posts()) while (have_posts()) : the_post(); ?> 

<div class="services-tabs"> 
    <div class="board"> 


      <div class="idTabs"> 
       <div class="tabs-images"> 

         <ul> 

            <?php $postslist = get_posts('post_type=services&numberposts=6&order=DESC'); foreach ($postslist as $post) : setup_postdata($post); ?> 

               <li> 
                <a href="#<?php the_ID();?>"> 


                   <img src="<?php bloginfo('template_directory'); ?>/js/cache/timthumb.php?src=<?php $imgsrc = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), "Full"); echo $imgsrc[0]; ?>&w=120&h=120"alt="<?php the_title(); ?>" class="footer-thumb" /> 

                   <div class="circle"> 
                    <p class="service-title"><?php the_title() ?></p> 
                   </div> 


                </a> 
               </li> 

            <?php endforeach; ?> 


         </ul> 
       </div> 
      </div> 


      <div class="inner" > 

        <?php $postslist = get_posts('post_type=services&numberposts=6&order=DESC'); foreach ($postslist as $post) : setup_postdata($post); ?> 

        <div class="result" id="<?php the_ID();?>"> 

         <?php the_content(); ?> 

        </div> 
        <?php endforeach; ?> 
      </div><!--inner--> 



</div><!--board--> 
</div> 
<?php 

endwhile; 

wp_reset_query(); 


return $output; 

} 

add_shortcode('services', 'ss_framework_services_sc'); 
Cuestiones relacionadas