WordPress内容提交故障:爬取的多图/视频仅存单个结果的解决方法
解决WordPress仅存储第一个图片/视频的问题
我一眼就看出问题所在了——你当前的代码每次循环都在覆盖$thecontent变量,而不是把所有图片和视频的HTML内容累加起来。另外,你用htmlspecialchars()转义HTML的操作也可能导致WordPress显示纯文本标签而非渲染元素,这部分也需要调整。
下面是修复后的完整方案:
1. 先初始化内容容器
在开始解析图片和视频之前,先把$thecontent初始化为空字符串,这样后续可以不断往里面追加内容:
$thecontent = ''; // 初始化空字符串,用来累加所有图片和视频的HTML
2. 修改图片循环:追加内容而非覆盖
把原来的赋值语句改成追加模式(用.=运算符),同时去掉htmlspecialchars()——因为WordPress需要原始HTML来渲染图片,转义后的内容只会显示成纯文本标签:
foreach ($html2->find('.entry-content img') as $image) { $imageurl = $image->src; $new = '<img src="' . $imageurl . '" style="height: auto; width: 100%;margin-bottom: 3px;">'; $thecontent .= $new . '<br>'; // 把当前图片的HTML追加到总内容里,加上换行 // 如果需要调试打印,单独用 print $new; 即可,不要转义 }
3. 视频循环做同样的修改
视频部分也是一样的逻辑,确保每一个视频的HTML都被追加到总内容中:
foreach ($html2->find('iframe') as $video) { $videourl = $video->src; $new = '<iframe src="' . $videourl . '" scrolling="no" frameborder="0" width="100%" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe>'; $thecontent .= $new . '<br>'; // 追加当前视频的HTML和换行 }
4. 保持WordPress存储代码不变
现在$thecontent已经包含了所有图片和视频的完整HTML内容,直接赋值给$content提交给WordPress即可:
$content = $thecontent; $my_post = array( 'post_title' => wp_strip_all_tags( trim( $title ) ), 'post_content' => $content, 'post_status' => 'publish', 'post_author' => 2, 'post_category' => array(2), 'post_date' => date('Y-m-d H:i:s') ); $post_id = wp_insert_post( $my_post ); remove_filter('content_save_pre', 'wp_filter_post_kses'); remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
关键原因解释
- 你之前只看到第一个图片,是因为每次循环都用
$thecontent = ...把之前的内容彻底覆盖了,最后$thecontent只保留了最后一次循环的结果。如果调试时print能看到所有内容,说明循环是正常的,只是存储时没把所有内容攒起来。 htmlspecialchars()是用来把HTML转义成纯文本的,适合在页面上打印源码调试,但不能把转义后的内容存到WordPress里,否则会显示<img ...>这样的文本,而不是实际的图片。
内容的提问来源于stack exchange,提问作者The Local Peon
相关产品推荐
相关产品推荐

