在页面内容中渲染wordpress短代码

时间:2015-05-21 16:31:40

标签: wordpress shortcode

我写了一个wordpress插件。它是一组短代码,用于从API获取,解析和呈现数据。 我现在正在编写一个主题来支持这个插件。我注意到Wordpress从编辑器内容中分离出短代码内容并单独呈现它们。 以下是我的问题的说明: 在管理面板中编辑页面或帖子:

<div class="row">
   <div class="col-lg-12">
     <p>HERE</p>
     [PluginShortcode_1]
   </div>
 </div>

假设PluginShortcode_1生成以下html:

<h1>This is the output of PluginShortcode_1</h1>
  <p>Got Here!</p>

我希望输出为:

<div class="row">
   <div class="col-lg-12">
     <p>HERE</p>
     <h1>This is the output of PluginShortcode_1</h1>
        <p>Got Here!</p>
   </div>
 </div>

但是,以下内容将发送到浏览器:

<h1>This is the output of PluginShortcode_1</h1>
  <p>Got Here!</p>
<div class="row">
   <div class="col-lg-12">
     <p>HERE</p>
   </div>
 </div>

显然,wordpress会执行以下操作:

  1. 解析并渲染短代码内容
  2. 渲染帖子内容
  3. 我见过对do_shortcode()的引用但我的插件定义了很多短代码,并且不会在template.php中明确知道哪些短代码或短代码在页面上而不预先解析内容,选择所有的短代码和应用过滤器。

    更新:

    短代码函数位于一组处理所有渲染的类中。大多数短代码内容单独存储在呈现内容的“视图”脚本中。

    上述示例将按以下方式调用:

    shortcodes.ini - 短代码及其相关功能的列表:

    [shortcode_values]
    PluginShortcode_1 = shortcodeOne
    AnotherShortcode  = anotherShortcode
    

    Shortcodes.php - 用于短代码函数和调用的容器:

    public function __construct() {
      $ini_array = parse_ini_file(__DIR__. '/shortcodes.ini', true);
      $this->codeLib = $ini_array['shortcode_values'];
      foreach ($this->codeLib as $codeTag => $codeMethod) {
        add_shortcode($codeTag, array(&$this, $codeMethod));
      }
    }
    
    public function shortcodeOne() {
      require_once(__DIR__ . 'views/shortcodeOneView.php');
    }
    

    视图/ shortcodeOneView.php

    <?php
    ?>
      <h1>This is the output of PluginShortcode_1</h1>
        <p>Got here!</p>
    

    短代码函数实际上负责获取数据,设置将暴露给视图的变量。

    UPDATE   更复杂的是,由于此插件发出了API请求,因此我将其限制为仅在帖子内容实际包含短代码时才被调用。

    在插件初始化脚本中,我有以下内容:

    class myPlugin.php:

    public function __construct() {
      . . .
      add_filter('the_posts', array(&$this, 'isShortcodeRequest'));
      . . .
    }
    
    public function isShortcodeRequest($posts) {
        if (empty($posts)) { return $posts; }
        foreach ($posts as $post) {
          if (stripos($post->post_content, '[PluginShortcode') !== false) {
            $shortcodes = new Shortcodes();
            break;
          }
        }
        return $posts;
      }
    

    我担心的是这个过滤器可能负责劫持输出。 。 。(?)

2 个答案:

答案 0 :(得分:3)

问题是短代码回调,你是“回声”而不是回复此问题,你应该用这个代替shortcodeOne()

public function shortcodeOne() {
  return "<h1>This is the output of PluginShortcode_1</h1><p>Got here!</p>";
}

WordPress在打印之前解析它的输出,并且在你解析 PluginShortcode_1 的情况下为了得到它的内容你打印它并且WordPress得到null作为回报。

答案 1 :(得分:0)

咩。在第199 - 200行的wp-includes函数do_shortocode()中:

$pattern = get_shortcode_regex();
    return preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $content );

preg_replace正在对字符串进行操作。该函数被调用。所述函数的输出用内容进行插值。

所以,输出缓冲救援!

public function shortcodeOne() {
  ob_start();
  require_once(__DIR__ . 'views/shortcodeOneView.php');
  $buffer = ob_get_clean();
  return $buffer;
}

产生预先输出的输出!呼。 (正如旁注,我的所有短代码函数都调用一个需要文件的渲染方法。让我免于大量更新。谢谢@all! }