如何使用str_ireplace()在发布/保存例程期间过滤帖子内容?

时间:2010-10-28 14:43:44

标签: php wordpress

我正在尝试创建一个函数,在保存(the_content)时对帖子内容进行文本替换。

存根函数如下,但如何获取对帖子内容的引用,然后将过滤后的内容返回到“publish_post”例程?

但是,我的替换是不工作和/或没有将更新的post_content传递给publish函数。价值永远不会被取代。

function my_function() {
    global $post;
    $the_content = $post->post_content;
    $text = " test ";
    $post->post_content = str_ireplace($text, '<b>'.$text.'</b>', $the_content  );
    return $post->post_content;
    }
add_action('publish_post', 'my_function');

3 个答案:

答案 0 :(得分:6)

当您提到the_content时,您是引用模板标签还是过滤器挂钩?

the_content作为过滤器挂钩仅适用于数据库读取期间的发布内容,而不是写入。在将内容保存到数据库之前修改帖子内容时使用的过滤器是content_save_pre

代码示例

在插件或主题的functions.php中,使用$content作为参数添加您的函数。以您希望的方式修改内容,并确保返回$content

然后在WordPress中遇到过滤器挂钩时使用add_filter('filter_name', 'function_name')来运行该函数。

function add_myself($content){
return $content." myself";
}
add_filter('content_save_pre','add_myself');

如果我写的帖子包括:

  

“到帖子的末尾,我想添加”

保存到数据库并显示在网站上时,它将显示为:

  

“在帖子的末尾,我想添加自己”。

您的示例过滤器可能会修改为如下所示:

function my_function($content) {
    $text = " test ";
    return str_ireplace($text, '<b>'.$text.'</b>', $content  );
}
add_filter('content_save_pre','my_function');

答案 1 :(得分:0)

可能更容易做到这样的事情:

function my_function($post) {
  $content = str_ireplace(" test ", '<b>'.$text.'</b>', $post->content);

  return $content;
}

较少关注函数的内部,但想法是将对象传递给()中的函数,然后直接调用而不是全局化值。它应该更直接。

答案 2 :(得分:0)

这里传递的变量是$ id。这应该有效:

function my_function($id) {
  $the_post = get_post($id);
  $content = str_ireplace(" test ", '<b>'.$text.'</b>', $the_post->post_content);

  return $content;
}
add_action('publish_post', 'my_function');