Ok, alors j’ai créé un code court qui fait écho à une partie de la sortie; le problème que j'ai découvert est que les valeurs doivent être renvoyées au lieu d'être renvoyées. J'ai des problèmes pour convertir le shortcode pour renvoyer la date à la place ..
J'ai essayé et ça casse mon shortcode ..
À quoi ressemblerait ce code shortcode s'il le renvoyait correctement au lieu de le renvoyer?
// [service slug="foobar"]
function services_shortcode( $atts ) {
// Attributes
extract( shortcode_atts(
array(
'slug' => '',
), $atts )
);
if ( isset( $slug ) ) {
$args = array( 'post_type' => 'cbd_services', 'name' => $slug ); // -1 Shows ALL Posts
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$custom = get_post_custom($post->ID);
$galleryPhotos = unserialize($custom["gallery_photos"][0]);
?>
<div class="accordion closed">
<h4 class="accordionTitle"><?php the_title(); ?><span>+</span></h4>
<div class="accordionContent">
<?php the_content(); ?>
<?php if(!empty($galleryPhotos)){
foreach($galleryPhotos as $photo){ ?>
<div class="photoContainer">
<a class="fresco" data-fresco-group="<?php echo $slug; ?>" href="<?php echo $photo['gallery_imagesrc']; ?>">
<div class="hover">#makeitbigger</div><img src="<?php echo get_template_directory_uri(); ?>/thumb.php?src=<?php echo urlencode($photo['gallery_imagesrc']); ?>&w=452&h=275&zc=1" />
<span class="photoCaption"><?php echo $photo['gallery_title']; ?></span>
</a>
</div>
<?php }
} ?>
</div>
</div>
<?php endwhile; wp_reset_query();
}}
add_shortcode( 'service', 'services_shortcode' );
Il suffit de définir une variable, de concatter tout le code HTML en chaîne et de la renvoyer.
<?php
function services_shortcode( $atts ) {
// Attributes
extract( shortcode_atts(
array(
'slug' => '',
), $atts )
);
$html='';
if ( isset( $slug ) ) {
$args = array( 'post_type' => 'cbd_services', 'name' => $slug ); // -1 Shows ALL Posts
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$custom = get_post_custom($post->ID);
$galleryPhotos = unserialize($custom["gallery_photos"][0]);
$html.='<div class="accordion closed">
<h4 class="accordionTitle">'.get_the_title($post->ID).'<span>+</span></h4>
<div class="accordionContent">'.get_the_content();
if(!empty($galleryPhotos)){
foreach($galleryPhotos as $photo){
$html.='<div class="photoContainer">
<a class="fresco" data-fresco-group="'.$slug.'" href="'.$photo['gallery_imagesrc'].'">
<div class="hover">#makeitbigger</div><img src="'.get_template_directory_uri().'/thumb.php?src='.urlencode($photo['gallery_imagesrc']).'&w=452&h=275&zc=1" />
<span class="photoCaption">'.$photo['gallery_title'].'</span>
</a>
</div>';
}
}
$html.='</div>';
$html.='</div>';
endwhile; wp_reset_query();
}
return $html;
}
add_shortcode( 'service', 'services_shortcode' );
Et n'oubliez pas de ob_end_clean()
pour ne pas faire écho à votre code!
Je voudrais ajouter un commentaire à la réponse de @ Shazzad, mais je dois poster une réponse:
ob_start() //start buffering
?>
<div>...your html...</div>
<?php
$html = ob_get_contents() //get your content
ob_end_clean() //clean echoed html code
return $html
Le moyen le plus simple consiste à utiliser la mise en mémoire tampon. Vous avez peut-être déjà utilisé ob_start()
et ob_get_contents()
PHP fonction native. Donc, votre code serait -
ob_start();
if ( isset( $slug ) ) {
.... rest of your code ....
<?php endwhile; wp_reset_query();
$content = ob_get_contents();
return $content;