首先,我应该说这是一个基于WordPress的问题,我最初在WordPress StackExchange上询问here。但我认为它变成了一个更基于PHP的问题,所以这就是我在这里问的原因。
基本上,我已经编写了这个preg_replace_callback
函数,在保存/发布帖子时,它将用WP Uploads目录中的URL替换所有图像URL。我有这个短暂的成功;有时它可以工作,但仅限于其中一个网址(在我的网站上的测试示例中,我有3个img
标记,每个标记都用段落分隔。
这是我的代码:
add_filter('content_save_pre', 'getpostimgs'); // content_save_pre filter may be depreceated? => http://adambrown.info/p/wp_hooks/hook/content_save_pre
function getpostimgs() {
global $post;
$postContent = $post->post_content;
$content = preg_replace_callback(
'/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', // pattern to match to (i.e the contents of an <img src="..." /> tag)
function ($match) {
$imgURL = $match[1]; // the second array (#1) (0-based) is the array with the URLs in. First array (#0) has the whole img tag in.
$image_data = file_get_contents($imgURL); // Get image data
$filename = basename($imgURL) . "-" . $post->ID . ".jpg"; // Create image file name
if( wp_mkdir_p( $upload_dir['path'] ) ) { // check upload file exists and the permissions on it are correct
$file = $upload_dir['path'] . '/' . $filename;
} else {
$file = $upload_dir['basedir'] . '/' . $filename;
} // save file to server
file_put_contents( $file, $image_data ); // save the file to the server
return $file;
},
$postContent
);
return $content;
}
我在前面添加了一些评论,希望能够解释我在每个阶段所做的工作。我不是PHP向导(我主要做WordPress PHP)所以要好!另外,正如我在评论中所说,我正在使用的WordPress过滤器content_save_pre
,它应该在保存到数据库之前编辑内容,已经depreciated。但这是一个WordPress问题,所以我会咨询关于那个问题的WordPress Stackexchange上的人。
无论如何,我的主要问题是,当我点击保存时,内容被完全擦除。正如我上面所说,我已经取得了短暂的成功 - 有时它会取代其中一个URL,有时则不会取代,而且大多数时候它只会擦除所有内容。我假设preg_replace_callback
出了问题。
最后:正如您从我发布到Wordpress StackExchange的链接(右上角)中看到的那样,我最初通过使用preg_match_all
来查找所有图片网址,然后使用{ {1}}循环遍历网址数组,并使用foreach
替换网址。如果您想查看该代码,则该代码为here。我根据this thread的建议改变了它(正确答案)。但这两种方法的行为基本相同。
感谢您的帮助:)
编辑:我稍微更新了我的代码,在全局变量/变量范围和一些语法/ WP错误方面犯了一些愚蠢的错误。这是我更新的代码:
prey_replace
如果我在single.php页面上调用此函数,它将起作用,即返回的帖子内容中的原始图像URL已被上载目录URL替换,因此正则表达式和内容是正确的。但是,当我尝试发布/更新帖子时(内容通常被擦除),它不起作用。有什么想法吗?