是否用数据库中的输出替换短码?

时间:2013-09-25 作者:its_me

例如,假设我创建了一个名为[sourcecode] 使用Shortcode API function, 用于在以下帖子中共享代码:

[sourcecode]
#button {
    font-weight: bold;
    border: 2px solid #fff;
}
[/sourcecode]
(它将代码封装在<pre><code> 标记,负责转义特殊字符等)

然后说,过了一会儿,我决定使用降价(不再使用[sourcecode] shortcode或在我的函数中有它的函数。php)或切换到新的博客平台。

鉴于这种情况,我希望[sourcecode] .... [/sourcecode] 用各自的产出替换所有员额。例如,如果其中一个帖子有以下内容:

[sourcecode]
#button {
    font-weight: bold;
    border: 2px solid #fff;
}
[/sourcecode]
它将替换为并保存到数据库中,作为:

<pre><code>#button {
    font-weight: bold;
    border: 2px solid #fff;
}
</code></pre>
同样,这应该发生在所有具有[sourcecode] 短代码。

wordpress是否内置了任何这样的重新生成功能,或者是否有一个插件可以实现我想要的功能?

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

首先,创建一个使用get_shortcode_regex 获取替换了短代码的帖子的帖子内容。

请注意,任何其他shoertcode都将保持不变

function get_replaced_sourcecode_sc( $post ) {
  if ( empty($post) ) global $post;
  if ( empty($post) || ! isset($post->post_content) ) return false;
  $content = $post->post_content;
  if (
    preg_match_all( \'/\'. get_shortcode_regex() .\'/s\', $post->post_content, $matches )
    && array_key_exists( 2, $matches ) && in_array( \'sourcecode\', $matches[2] )
  ) {
    foreach ( $matches[2] as $i => $sc ) {
      if ( $sc == \'sourcecode\' )
        $now = $matches[0][$i];
        $replace = do_shortcode($now);
        $content = str_replace( $now, $replace, $content );
    }
  }
  return $content;
}
现在在您的functions.php 您还可以添加以下代码:

function replaced_sourcecode_sc_all() {

   $already = get_transient(\'replaced_sourcecode\') ? : array();

   $all = get_posts(\'nopaging=1post_type=post\');

    if ( ! empty($all) ) {

      if ( count($all) == count($already) ) {
         error_log(\'replaced_sourcecode_sc_all already done its work\');
         return;
      }

      $done = array();

      foreach ( $all as $one ) {

        if ( in_array($one->ID, $already) ) continue;

        $content = get_replaced_sourcecode_sc( $post );

        $post = array(\'ID\' => $one->ID, \'post_content\' => $content);

        $do = wp_update_post( $post );
        if ( $do ) $done[] = $do;

      }

      set_transient(\'replaced_sourcecode\', $done);

    }
}

add_action(\'shutdown\', \'replaced_sourcecode_sc_all\');
现在,启用WP日志记录,然后访问您的站点2到3次。检查错误日志,如果您发现字符串“replaced\\u sourcecode\\u sc\\u all have done it works”,您可以删除该函数(或者简单地注释掉“add\\u action”行)。

结束

相关推荐

Custom field in a shortcode?

我无法将图像从我的一个字段转换为短代码(它与get_the_post_thumbnail($post->ID, \'thumbnail\') 但我需要字段中的值udstiller logo.function logo_shortcode( $atts ) { extract( shortcode_atts( array( \'limit\' => \'50\', \'orderby\' => \'name\',