在wp-admin中保存页面时执行的自定义快捷代码

时间:2014-04-07 作者:Matt Stone

我正在开发一个自定义快捷码:

[abuzz-store slug="woolworths" fields="description,level,phone" more="true"]

短代码在网站前端正常工作。但是,我无法再在wp admin中保存对页面的编辑。尝试在适当的模板之外执行短代码时会引发各种PHP错误。

以下是短代码功能:

/**
 * [indo_store_details_shortcode description]
 *
 * @param  [type] $atts [description]
 * @return [type]       [description]
 */
function indo_store_details_shortcode($atts)
{
    $options = shortcode_atts(array(
        // Abuzz Store slug
        \'slug\'      => \'\',

        // Abuzz Store fields to display (title, description, level, phone)
        \'fields\'    => \'\',

        // Display a link to further store details (store page)
        \'more\'      => false,
    ), $atts);

    // sanity checks
    if (!$options[\'slug\']) return \'\';
    // if (is_admin()) return \'\';

    $output = \'\';

    // retrieve store information
    $store = get_posts(array(
        \'name\' => $options[\'slug\'],
        \'post_type\' => \'store\',
    ))[0];

    // determine fields to display
    $fields = explode(\',\', $options[\'fields\']);

    $output .= \'<article class="abuzz-store">\';

    // title field
    if (in_array(\'title\', $fields)) {
        $output .= sprintf(\'<h2>%s</h2>\', $post->post_title);
    }

    // "metadata" .options-list
    if (in_array(\'level\', $fields) ||
        in_array(\'phone\', $fields)) {

        $output .= \'<ul class="nav  options-list">\';

        // level field
        if (in_array(\'level\', $fields)) {
            $levels = get_group(\'Level\', $store->ID);

            $output .= sprintf(\'<li class="icon-text"><i class="icon-text__icon  icon  icon-level-black"></i> %s</li>\', indo_combine_levels($levels));
        }

        // phone field
        if (in_array(\'phone\', $fields)) {
            $output .= sprintf(\'<li class="icon-text"><i class="icon-text__icon  icon  icon-phone-black"></i> %s</li>\', get(\'phone_number\', 1, 1, $store->ID));
        }

        $output .= \'</ul>\';

    }

    // description field
    if (in_array(\'description\', $fields)) {
        $output .= get(\'information_text\', 1, 1, $store->ID);
    }

    // "More details" link
    if ($options[\'more\']) {
        $output .= sprintf(\'<p><a href="%s" title="More details" class="btn  btn--black-arrow  icon-text--rev">More details  <i class="icon-text__icon  icon  icon-arrow-white"></i></a></p>\', get_permalink($store->ID));
    }

    $output .= "</article>\\n";

    return $output;
}
add_shortcode(\'abuzz-store\', \'indo_store_details_shortcode\');
错误:Fatal error: Call to undefined function get_group() in D:\\xampp\\htdocs\\126-indooroopilly-shopping-centre\\www\\public_html\\wp-content\\themes\\indooroopilly\\include\\shortcodes.php on line 90

get_group 是由第三方插件(Magic Fields)添加的函数,该插件未加载到wp admin中。这正是我所期望的。

为什么在保存页面时执行此操作?

2 个回复
SO网友:Chip Bennett

短代码必须return, echo or print 他们的产出。As the Codex entry for add_shortcode() explains:

请注意,由shortcode调用的函数不应产生任何类型的输出。短代码函数应返回用于替换短代码的文本。直接生成输出将导致意外的结果。这类似于过滤器函数的行为方式,因为它们不应该在调用中产生预期的副作用,因为您无法控制从何时何地调用它们。

将您的快捷码回调函数更改为return 它的价值。

SO网友:Jamie Edwards

您还可以考虑为您的短代码使用PHP的输出缓冲ob_startob_get_clean 像这样:

function indo_store_details_shortcode( $attr ) {
  ob_start();

  //Add all your shortcode stuff here

  return ob_get_clean();
}
add_shortcode( \'abuzz-store\', \'indo_store_details_shortcode\' );
ob\\U启动功能将打开输出缓冲。当输出缓冲处于活动状态时,不会从脚本发送任何输出(标头除外),而是将输出存储在内部缓冲区中。

结束

相关推荐

Manipulated shortcode output

我开发的一个注册短代码的插件有问题。短代码返回一个包含有效HTML的字符串,但一些主题似乎操纵了短代码返回的HTML,我真的不明白原因是什么。例如,这是我的短代码的正确输出:<div class=\"tile\"> <a> <img src=\"0.jpg\" /> <div class=\"caption\"> <p>Kate</p> </div&