使用preg_place过滤自定义文本区域

时间:2013-09-23 作者:Ronnieinspain

我正在开发custom post type, 其中包括从post editor内部发送电子邮件的可能性。电子邮件正文文本区域通过自定义设置页面填充并保存到post_meta array 其中还包括电子邮件和主题。直到这里一切都好。

设置页面中的标准电子邮件内容包括%%PROPOSAL_LINK%%%%PROPOSAL_LINK_URL%% 这些邮件应该被过滤掉,并替换为html链接和指向邮件来源的永久链接的普通链接。

以下是我现在使用的函数:

function filter_email_text_for_post_link( $post ) {

// retrieve the \'proposal_email\' post_meta (array)
$post_meta = get_post_meta( $post->ID, \'proposal_email\', TRUE );
// retrieve email body \'proposal_email_text\' from array
$email_content = $post_meta[\'proposal_email_text\'];

// bail if email has no content
if( $email_content == \'\' ){ return; }

// patterns to look for in email body
$link_pattern = \'%%PROPOSAL_LINK%%\';
$url_pattern  = \'%%PROPOSAL_LINK_URL%%\';

// returns for each pattern
$proposal_link = \'<a href="\' . get_permalink( $post_id ) . \'">here</a>\';
$porposal_link_url = get_permalink( $post_id );

// match and replace with the above patterns
$email_content = str_replace( $link_pattern, $proposal_link, $email_content );
$email_content = str_replace( $url_pattern, $proposal_link_url, $email_content );

// update the post_meta
$post_meta[\'proposal_email_text\'] = $email_content;
update_post_meta( $post->ID, \'proposal_email\', $post_meta );

}

add_action( \'save_post\', \'filter_email_text_for_post_link\' );
出于某种原因,这根本不起作用;根本没有错误,什么都没有!最初,我尝试在save\\u post上保存数据的函数中调用此函数(稍微编辑),但也不起作用。

有什么建议吗?

提前谢谢。

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

最终的工作功能:

与我最初使用的函数相比str_replace 代替preg_replace 由于生成的代码更短,因此更简洁、更快。还向add_action 呼叫删除使用的需要Global $post; 此外,如果$post_meta[\'proposal_email_text\'] 尚未设置(新职位)。

function filter_email_text_for_post_link( $post_id, $post ) {

// retrieve the \'proposal_email\' post_meta (array)
$post_meta = get_post_meta( $post->ID, \'proposal_email\', TRUE );
// retrieve email body \'proposal_email_text\' from array
if( ! empty( $post_meta[\'proposal_email_text\'] ) ){
    $email_content = $post_meta[\'proposal_email_text\'];
} else {
    return; 
}

// bail if email has no content
if( $email_content == \'\' ){ return; }

// patterns to look for in email body
$link_pattern = \'%%PROPOSAL_LINK%%\';
$url_pattern  = \'%%PROPOSAL_LINK_URL%%\';

// returns for each pattern
$proposal_link = \'<a href="\' . get_permalink( $post_id ) . \'">here</a>\';
$proposal_link_url = get_permalink( $post_id );

// match and replace with the above patterns
$email_content = str_replace( $link_pattern, $proposal_link, $email_content );
$email_content = str_replace( $url_pattern, $proposal_link_url, $email_content );

// update the post_meta
$post_meta[\'proposal_email_text\'] = $email_content;
update_post_meta( $post->ID, \'proposal_email\', $post_meta );

}

add_action( \'save_post\', \'filter_email_text_for_post_link\', 10, 2 );

SO网友:chrisguitarguy

preg_replace 期望它是由字符包围的正则表达式。通常是斜线,如下所示:

\'/.*/\'
执行此操作时:

preg_replace(\'%%PROPOSAL_LINK_URL%%\', $some_text, $replacement);
preg_replace 想想前两个% 是周围的字符,由于无法识别的修饰符而失败。这很容易测试:

$ php -a
Interactive shell

php > echo preg_replace(\'%%PROPOSAL_LINK_URL%%\', \'%%PROPOSAL_LINK_URL%%\', \'here\'), PHP_EOL;
PHP Warning:  preg_replace(): Unknown modifier \'P\' in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
PHP   2. preg_replace() php shell code:1

Warning: preg_replace(): Unknown modifier \'P\' in php shell code on line 1

Call Stack:
   28.9460     235264   1. {main}() php shell code:0
   28.9460     236016   2. preg_replace() php shell code:1


php > 
您有两种选择:

将您的模式更改为以下内容:/%%PROPOSAL_LINK_URL%%//%%PROPOSAL_LINK%%/

$ php -a
Interactive shell

php > echo preg_replace(\'/%%PROPOSAL_LINK_URL%%/\', \'%%PROPOSAL_LINK_URL%%\', \'here\'), PHP_EOL;
here
忘掉一切preg_replace 因为你不需要它。使用str_replacestr_ireplace 相反

<?php
str_replace(\'%%PROPOSAL_LINK_URL%%\', $proposal_link_url, $email_content);
str_ireplace(\'%%PROPOSAL_LINK%%\', $proposal_link, $email_content);
请注意str_replace 默认情况下,在包含多字节字符(如UTF-8)的字符串上使用它是不安全的。你可以change this.

注意:您已使用$link_pattern 在代码示例中重复两次。我想你是说第二个$url_pattern.

EDIT: 看来没有mb_* 替换为str_replacestr_ireplace this comment 在php上。net揭示了这个问题。str_replace <如果针和干草堆的编码相同,em>应该处理多字节字符串。

SO网友:gmazzap

你的问题是一个未逃逸的正则表达式。但是你不需要preg_replace, 只是一个str_replace

$email_content = str_replace( $link_pattern, $proposal_link, $email_content );
$email_content = str_replace( $link_pattern, $porposal_link_url, $email_content );
仅供参考,在这种情况下,正则表达式的正确方法是:

$link_pattern = preg_quote(\'%%PROPOSAL_LINK%%\');
$email_content = preg_replace( \'/\' . $link_pattern . \'/\', $proposal_link, $email_content);

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $