2012-01-01 28 views
6

Tôi có một trang có trình chiếu ở trên cùng và hình ảnh được chèn vào nội tuyến vào khu vực nội dung.Wordpress: không bao gồm hình ảnh được chèn vào bài đăng 'từ get_children

Tôi cần loại trừ các hình ảnh đã được chèn vào bài đăng từ trình chiếu.

Hiện tại tôi không bao gồm 'Hình ảnh nổi bật', nhưng điều này giới hạn tôi thành một hình ảnh có thể được chèn vào bài đăng.

Đây là mã hiện tại của tôi:

$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); 

Trước đây tôi đã sử dụng trường mô tả các dữ liệu meta hình ảnh để loại trừ các hình ảnh bằng cách nhập 'loại trừ'. Điều này không tốt cho người dùng cuối như tôi muốn.

Bất kỳ đề xuất, plugin hoặc mã nào dựa trên!

Cập nhật: Tôi đã cập nhật mã, vì vậy bây giờ tôi nhận được bất kỳ URL hình ảnh từ POST_CONTENT và đánh dấu chúng chống lại những hình ảnh trình chiếu.

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

Đây là giải pháp OK, mặc dù regex có thể được cải thiện.

Một bước tốt hơn là thêm mảng hình ảnh vào trường trường tùy chỉnh, trong đó được cập nhật khi cập nhật bài đăng hoặc trang hoặc xuất bản.

Bất kỳ đề xuất nào về cách thực hiện việc này?

+0

Bạn có tự đính kèm hình ảnh trình chiếu vào trang qua menu phương tiện của quản trị viên không? – paislee

Trả lời

4

Tôi đã cập nhật mã, vì vậy bây giờ tôi nhận được bất kỳ URL hình ảnh nào từ post_content và kiểm tra chúng dựa trên hình ảnh trình chiếu.

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

Tôi chưa hiểu rõ vấn đề của bạn, nhưng cách loại trừ ID div trong đó trình chiếu có mặt?

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

Thay thế 'NAME' sau hình thu nhỏ '. trong dấu ngoặc đơn. Hy vọng điều này sẽ hữu ích.

+0

Điều đó sẽ không hoạt động. Get_children đã thiết lập các thông số. Cảm ơn mặc dù. – addedlovely

0

Tôi nghĩ rằng điều dễ nhất để làm sẽ được sử dụng các plugin Meteor Slideshow để tạo ra một slideshow cho mỗi trang, sau đó chèn shortcode cho slideshow thích hợp trong lĩnh vực nội dung của trang thích hợp. Có, điều đó có nghĩa là bạn sẽ phải chỉnh sửa từng trang "bên ngoài" trình chỉnh sửa trang, nhưng nó cũng cho phép bạn dễ dàng, hoàn toàn kiểm soát ảnh nào và không xuất hiện trong mỗi trình chiếu và shortcode rất dễ dàng trình chỉnh sửa trang.

0

Plugin Media Custom Fields cho phép bạn thêm dữ liệu tùy chỉnh vào mục phương tiện chính xác như với trường bài đăng tùy chỉnh, cung cấp cách gắn cờ hình ảnh chỉ trình chiếu thân thiện với người dùng. Từ plugin FAQ:

Ngoài việc cung cấp cho bạn tùy chọn thêm trường tùy chỉnh, trường tùy chỉnh của bạn sẽ hiển thị ở tất cả các vị trí thích hợp. Nếu bạn truy cập phần phương tiện để quản lý phương tiện như bạn thường làm, chúng sẽ hiển thị trên biểu mẫu phương tiện chỉnh sửa. Các trường tùy chỉnh cũng hiển thị khi bạn đang tải hình ảnh lên bài đăng và trong tất cả các vị trí được mong đợi khác.

Một cách tiếp cận là để cài đặt plugin này và thêm một lĩnh vực tùy chỉnh như Slide với giá trị TRUE hình ảnh slide của bạn thông qua Bảng điều khiển -> Media menu. Sau đó, mã bộ lọc của bạn có thể là:

$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 
    } 
    // .. 
} 

Lưu ý rằng với phương pháp này giá trị cho Slide có thể được thiết lập để bất cứ điều gì ngoại trừ chuỗi rỗng. Bạn có thể muốn xác định Slide làm hằng số lớp ở đâu đó để tránh mã hóa cứng.

Ưu

  1. Không yêu cầu bất kỳ công việc trên một phần của poster
  2. Future-proof: plugin dường như được dựa trên bài tốt tuổi chức năng, và file đính kèm chỉ là một loại đăng bài, vì vậy không có gì lạ.
6

Chỉ cần làm điều tương tự. Cách tiếp cận ban đầu của bạn là cách tôi muốn thực hiện - chỉ cần loại trừ bất kỳ hình ảnh nào đã được chèn vào bài đăng xuất hiện trong thanh trượt. Nhưng tôi không muốn khách hàng phải làm bất cứ điều gì đặc biệt để làm cho nó xảy ra. Đây là mã của tôi.

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

Bit đầu tiên nhận tất cả hình ảnh được liên kết với bài đăng. $ Preg_match_all nhận tất cả các hình ảnh trong nội dung bài đăng. Sau đó, khi chúng ta lặp qua các hình ảnh để hiển thị chúng trong thanh trượt, in_array kiểm tra các url của các hình ảnh được chèn vào với url của hình ảnh sắp được thêm vào thanh trượt và bỏ qua đến hình kế tiếp nếu có khớp.

Cảm ơn bạn đã đăng bài, giúp tôi suy nghĩ đúng hướng.

+0

Phương pháp hay!Điều này chỉ có thể áp dụng cho các phiên bản 'WP' gần đây nhưng tôi thấy rằng' $ attachment-> guid' và giá trị trong '$ matches'' Array' không khớp với hình ảnh được chèn vào bài đăng sẽ có kích thước hình ảnh được thêm vào đến cuối tên tập tin? Khắc phục nhanh của tôi là chọn 'Kích thước' đầy đủ khi chèn hình ảnh mà không có kích thước tệp bổ sung hoặc chỉnh sửa nó trong bài đăng, cả hai giải pháp không tuyệt vời. – Brownrice

0

Đây là một cách tiếp cận khác.

Tôi không thích sử dụng url, vì hình ảnh được chèn vào bên trong khu vực nội dung có thể có kích thước khác nhau như phương tiện, hình thu nhỏ hoặc đầy đủ. Vì vậy, chỉ url sẽ không khớp.

Sử dụng đoạn mã trên,

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; 

} 

Các hình ảnh không được thiết lập như là đặc trưng và không được sử dụng bên trong bài được lấy ra.

+0

Điều này có thể không hoạt động vì hình ảnh có thể được tải lên một thư mục khác tùy thuộc vào cấu trúc liên kết của bạn. – Relequestual

0

Vì lý do hiệu suất, tôi sẽ không thực thi mã trong khi trang đang được hiển thị, nhưng thay vì gắn mã vào móc save_post. Khi nội dung bài đăng được chỉnh sửa và lưu, móc sẽ được gọi và tất cả ảnh đính kèm (hoặc id của chúng) không được sử dụng trong nội dung sẽ được lưu vào bảng sau. Khi thanh trượt được hiển thị, các id hình ảnh có thể được truy cập thông qua get_post_meta ($ post_id, 'image_ids_for_slider'). Như thế này, tôi có thể tránh thực hiện thao tác preg_match_all khi hiển thị trang. Đây có thể không phải là lý do hiệu suất khi nội dung bài đăng nhỏ và khi chỉ có một thanh trượt được tải, nhưng nhìn chung tôi thấy đây là một cách tiếp cận nhỏ hơn một chút vì lý do mở rộng.

//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); 
Các vấn đề liên quan