web-dev-qa-db-ja.com

リターンvsエコーショートコード

さて、私は短いコードを作成しました。これはechoの出力の一部です。私が発見した問題は、エコーの代わりに値を返さなければならないということです。代わりに日付を返すようにショートコードを変換するのに問題があります。

試してみたところ、ショートコードが壊れてしまいました。

このショートコードコードは、エコーするのではなく正しくコードを返したとしたらどうでしょうか。

// [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' );
1
Austin Biggs

変数を定義し、すべてのHTMLを文字列として連結して返します。

<?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' );
2
Rajeev Vyas

ob_end_clean()を忘れないようにしましょう。

@ Shazzadの回答にコメントを追加できることを願いますが、回答を投稿する必要があります。

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
0
PJ3

最も簡単な方法はバッファリングを使うことです。あなたはすでに ob_start()ob_get_contents() PHPを使っているかもしれません_ネイティブ関数だからあなたのコードは - だろう

ob_start();
if ( isset( $slug ) ) {
.... rest of your code ....
<?php  endwhile; wp_reset_query();
$content = ob_get_contents();

return $content;
0
Shazzad