我的页面顶部有幻灯片,图片内嵌插入内容区域。
我需要从幻灯片中排除已插入帖子的图像。
目前我排除了“特色图片”,但这限制了我可以插入帖子中的一张图片。
这是我现有的代码:
$thumbnail = get_post_thumbnail_id();
$images = get_children( 'post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent='.$post->ID .'&exclude='.$thumbnail);
之前我使用图像元数据的描述字段通过输入'exclude'来排除图像。对于最终用户来说,这并不像我希望的那样好。
基于任何建议,插件或代码!
更新 我已经更新了代码,所以现在我从post_content获取任何图像URL并根据幻灯片图像检查它们。
$content = $post->post_content;
$inlineImages = array();
preg_match( '/src="([^"]*)"/i', $content, $inlineImages ) ;
$thumbnail = get_post_thumbnail_id($post->ID);
$images = get_children( 'post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent='.$post->ID .'&exclude='.$thumbnail);
if ($images) {
echo '<div id="slideshow">';
foreach ( $images as $attachment_id => $attachment ) {
$image = wp_get_attachment_image_src( $attachment_id,array(900,265));
if (!in_array($image[0],$inlineImages)) {
echo '<img src="'.$image[0].'" width="'. $image[1] .'" height="'. $image[2].'">';
}
}
echo '</div>';
}
这是一个很好的解决方案,虽然可以改进正则表达式。
更好的步骤是将图像数组添加到自定义字段字段中 在帖子/页面更新或发布时更新。
有关如何解决这个问题的任何建议吗?
答案 0 :(得分:6)
只需要做同样的事情。您原来的方法是我想要的方式 - 只是排除插入到帖子中的任何图像出现在滑块中。但我不希望客户做任何特别的事情来实现它。这是我的代码。
$args = array( 'post_type' => 'attachment', 'post_mime_type'=>'image','numberposts' => -1, 'post_status' => null, 'post_parent' => $post->ID );
$attachments = get_posts($args);
preg_match_all("/<img[^']*?src=\"([^']*?)\"[^']*?>/", $post->post_content, $matches, PREG_PATTERN_ORDER);
/* $matches[1] holds the urls as an array */
foreach ( $attachments as $attachment ) {
if(in_array($attachment->guid, $matches[1])){ continue;}
wp_get_attachment_image( $attachment->ID , 'slider_size');
}
第一位获取与帖子相关的所有图像。 $ preg_match_all获取帖子正文中的所有图像。然后,当我们遍历图像以在滑块中显示它们时,in_array将检查插入的图像的URL,这些图像的图像的URL将要添加到滑块,如果匹配则跳到下一个图像的URL。
谢谢你发帖,让我思考正确的方向。
答案 1 :(得分:4)
我已经更新了代码,所以现在我从post_content获取任何图片网址,并根据幻灯片图片进行检查。
$content = $post->post_content;
$inlineImages = array();
preg_match( '/src="([^"]*)"/i', $content, $inlineImages ) ;
$thumbnail = get_post_thumbnail_id($post->ID);
$images = get_children( 'post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent='.$post->ID .'&exclude='.$thumbnail);
if ($images) {
echo '<div id="slideshow">';
foreach ( $images as $attachment_id => $attachment ) {
$image = wp_get_attachment_image_src( $attachment_id,array(900,265));
if (!in_array($image[0],$inlineImages)) {
echo '<img src="'.$image[0].'" width="'. $image[1] .'" height="'. $image[2].'">';
}
}
echo '</div>';
}
答案 2 :(得分:0)
我认为最简单的方法是使用Meteor幻灯片插件为每个页面创建幻灯片,然后在适当页面的内容区域插入适当幻灯片的短代码。是的,这意味着您必须在页面编辑器的“外部”编辑每个页面,但它也可以让您轻松,完全地控制每张幻灯片中哪些照片不会出现,并且短代码非常容易使用页面编辑器。
答案 3 :(得分:0)
Media Custom Fields插件可让您将自定义数据添加到媒体项目,就像使用自定义帖子字段一样,提供了一种用户友好的标记幻灯片显示图像的方式。来自插件FAQ:
除了为您提供添加自定义字段的选项外,您的自定义字段还会显示在所有适当的位置。如果您像往常一样转到媒体部分管理媒体,它们将显示在编辑媒体表单上。将图像上传到帖子以及所有其他预期位置时,自定义字段也会显示。
一种方法是安装此插件,并通过信息中心 - &gt;向幻灯片图像添加值为Slide
的{{1}}等自定义字段。媒体菜单。然后您的过滤器代码可能是:
TRUE
请注意,使用此方法,$thumbnail = get_post_thumbnail_id();
$images = get_children( /* removed for brevity */ );
if ($images) {
// ..
foreach ( $images as $attachment_id => $attachment ) {
// skip images not marked for slideshow
if ( !get_post_meta($attachment_id, 'Slide') ) continue;
// otherwise do slideshow things
}
// ..
}
的值可以设置为除空字符串之外的任何值。您可能希望将Slide
定义为某个类常量,以避免硬编码。
<强>优点强>
答案 4 :(得分:0)
这是另一种方法。
我不想使用 urls ,因为插入内容区域内的图片可能具有不同的大小,如中,缩略图或完整。所以,网址只是不匹配。
使用上面的代码,
function printMeImages() {
$content = $post->post_content;
$inlineImages = array();
// populate ids of images from wp-image-id
preg_match_all( '/wp-image-([^"]*)"/i', $content, $inlineImages ) ;
$thumbnail = get_post_thumbnail_id($post->ID);
$images = get_children( 'post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent='.$post->ID .'&exclude='.$thumbnail);
$out = "";
if ($images) {
$out .= '<ul id="slideshow">';
foreach ( $images as $attachment_id => $attachment ) {
$image = wp_get_attachment_image_src( $attachment_id,'desiredImageSize');
// $inlineImages[1] has ids to be discarded
if (!in_array($attachment_id,$inlineImages[1])) {
$out .= '<li><img src="'.$image[0].'" width="'. $image[1] .'" height="'. $image[2].'"></li>';
}
}
$out .= '</ul>';
}
return $out;
}
检索未设置为特色且未在帖子内使用的图像。
答案 5 :(得分:0)
出于性能原因,我不会在呈现页面时执行代码,而是将代码绑定到save_post挂钩。编辑和保存帖子内容时,将调用挂钩,并且内容中未使用的所有附加图像(或其ID)将保存到postmeta表中。渲染滑块时,可以通过get_post_meta($ post_id,'image_ids_for_slider')访问图像ID。 像这样我可以避免在页面渲染上执行preg_match_all操作。当帖子内容很小并且只加载了一个滑块时,这可能不是一个性能原因,但一般来说,我发现这种方法对于缩放原因来说有点清晰。
//hook this function to save post action
function save_ids_of_image_attachments_not_used_in_the_content( $post_id, $post ) {
$args = array( 'post_type' => 'attachment',
'post_mime_type'=>'image',
'numberposts' => -1,
'post_status' => null,
'post_parent' => $post_id
);
$attachments = get_posts($args);
preg_match_all("/<img[^']*?src=\"([^']*?)\"[^']*?>/", $post->post_content, $matches, PREG_PATTERN_ORDER);
$ids_of_attached_images_not_in_content = array();
/* $matches[1] holds the urls as an array */
foreach ( $attachments as $attachment ) {
if(in_array($attachment->guid, $matches[1])){
continue;
}
$ids_of_attached_images_not_in_content[] = $attachment->ID;
}
// save the image_ids as postmeta
update_post_meta($post_id, 'image_ids_for_slider', $ids_of_attached_images_not_in_content);
}
add_action( 'save_post', 'save_ids_of_image_attachments_not_used_in_the_content', 10, 2 );
答案 6 :(得分:-1)
我还没有完全理解你的问题,但如何排除幻灯片显示的div ID?
$thumbnail = get_post_thumbnail_id();
$images = get_children('post_type=attachment&post_mime_type=image&order=asc&orderby=menu_order&post_parent='.$post->ID .'&exclude='.$thumbnail. '&NAME');
缩略图后替换'NAME'。在括号中。 希望这会有所帮助。