Wordpress:从get_children中排除“插入帖子”的图像

时间:2012-01-01 23:09:02

标签: wordpress attachment

我的页面顶部有幻灯片,图片内嵌插入内容区域。

我需要从幻灯片中排除已插入帖子的图像。

目前我排除了“特色图片”,但这限制了我可以插入帖子中的一张图片。

这是我现有的代码:

$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>';
    }

这是一个很好的解决方案,虽然可以改进正则表达式。

更好的步骤是将图像数组添加到自定义字段字段中 在帖子/页面更新或发布时更新。

有关如何解决这个问题的任何建议吗?

7 个答案:

答案 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定义为某个类常量,以避免硬编码。

<强>优点

  1. 海报上不需要任何工作
  2. 面向未来:该插件似乎基于良好的帖子功能,而且附件只是一种帖子,所以没有什么奇怪的。

答案 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'。在括号中。 希望这会有所帮助。