Shortcode won't execute

时间:2014-06-17 作者:user51030

我用我有限的知识,google和stackexchange创建了一个短代码。

但当我加载页面时,它会加载到页面内容上方,并显示为html文本。

(shortocode text)
-------
page contents appearing normally
正如我所说,我对这种类型的编码知识有限(零),我无法找出哪个部分/什么部分不起作用。

我附加了我使用的代码的压缩版本,在shortcode函数中显示的内容更少。

// Add Shortcode
function p_formatage( $atts , $content = null ) {

    // Attributes
    extract( shortcode_atts(
        array(
            \'postid\' => \'\',
            \'ptitle\' => \'\',
            \'pimage\' => \'\',
        ), $atts )
    );

    $postid = $atts[\'postid\'];
    $ptitle = $atts[\'ptitle\'];
    $pimage = $atts[\'pimage\'];

    // Post title
    $p-ptitle = if ( empty( $ptitle ) ) {
    echo "Whoops! Looks like went wrong here!";
    }
    else { 
     if ( $postid == true ) {
     echo "<span class="ptitle"><a href="http://www.website.com/\' . $postid . \'">\' . $ptitle . \'</a></span>";
     }
     else { 
     echo "<span class="ptitle">\' . $ptitle . \'</span>";
     }
    }

    $p-beta = if ( empty( $pimage) ) {
    echo "$ptitle";
    }
    else { 
    echo "<span class="pimage"><img href="http://www.website.com/xx.jpg";/></span>";
    }

   $pclass = if ( $postid ) {
    echo "$p-ptitle";
    }
    else { 
    echo "$p-beta";
    }

    // Output
    $output = {
        echo "$pclass";
    }

    return $output;
}

add_shortcode( \'p-fmt\', \'p_formatage\' );

2 个回复
最合适的回答,由SO网友:engelen 整理而成

您正在使用shortcode函数直接输出某些内容(使用echo). 短代码应该返回所需的输出,而不是直接回显。你可以使用output buffering “捕获”输出的任何内容(例如,通过echo) 在输出缓冲区中,而不是直接输出它,然后检索缓冲区的内容。

这将产生如下实现:

function wpse149825_my_shortcode( $atts, $content = NULL ) {
    // Turn on output buffering, which sends output from "echo" to a "buffer" instead of directly outputting it
    ob_start();

    // Output shortcode content
    echo \'Shortcode content\';

    // Get buffer contents
    $contents = ob_get_clean();

    // Return shortcode content
    return $contents; 
}

add_shortcode( \'my_shortcode\', \'wpse149825_my_shortcode\' );

SO网友:Subharanjan

您需要修复中断的echo语句。此外,正如上文@engelen所说,不要直接回应输出。使其成为缓冲区并“返回”它。

下面是有帮助的代码。

<?php
// Add Shortcode
function p_formatage( $atts, $content = null ) {

    // Attributes
    extract( shortcode_atts(
            array(
                \'postid\' => \'\',
                \'ptitle\' => \'\',
                \'pimage\' => \'\',
            ),
            $atts,
            \'p-fmt\'
        )
    );

    $postid = $atts[\'postid\'];
    $ptitle = $atts[\'ptitle\'];
    $pimage = $atts[\'pimage\'];

    // Start buffering the output
    ob_start();

    /* ------ DO WHATEVER OUTPUT YOU WANT TO DISPLAY BELOW THIS -------- */

    // Post title
    if ( empty( $ptitle ) ) {
        echo \'Whoops! Looks like went wrong here!\';
    } else {
        if ( $postid == true ) {
            echo \'<span class="ptitle"><a href="http://www.website.com/\' . $postid . \'">\' . $ptitle . \'</a></span>\';
        } else {
            echo \'<span class="ptitle">\' . $ptitle . \'</span>\';
        }
    }

    /* ------ STOP SPITING OUT THE OUTPUT NOW  ------------------------ */

    // Get buffer contents
    $contents = ob_get_clean();

    // Return shortcode content
    return $contents;
}
add_shortcode( \'p-fmt\', \'p_formatage\' );

结束