programing

워드프레스 : get_children에서 '게시물에 삽입'된 이미지 제외

newstyles 2023. 9. 11. 21:30

워드프레스 : get_children에서 '게시물에 삽입'된 이미지 제외

상단에 슬라이드쇼가 있는 페이지가 있고, 콘텐츠 영역에 이미지가 일렬로 삽입되어 있습니다.

게시물에 삽입된 이미지는 슬라이드쇼에서 제외해야 합니다.

현재 '특징 이미지'를 제외하고 있지만, 이는 게시물에 삽입할 수 있는 이미지를 하나로 제한합니다.

기존 코드는 다음과 같습니다.

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

이전에 이미지 메타데이터의 설명 필드를 사용하여 '제외'를 입력하여 이미지를 제외한 적이 있습니다.최종 사용자가 원하는 만큼 좋은 제품은 아닙니다.

모든 제안, 플러그인 또는 코드 기반!

업데이트 : 코드를 업데이트해서 이제 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>';
    }

이것은 정상적인 해결책이지만, 정규성은 개선될 수 있습니다.

더 좋은 단계는 포스트/페이지 업데이트 또는 게시 시 업데이트되는 사용자 지정 필드 필드에 이미지 배열을 추가하는 것입니다.

이 문제를 어떻게 해결할 것인지에 대한 제안이 있습니까?

그냥 똑같은 일을 할 필요가 있었어요.독자 분의 독창적인 접근법은 제가 하고 싶었던 방식입니다. 게시물에 삽입된 이미지를 슬라이더에 표시되지 않도록 제외하는 것뿐입니다.하지만 저는 고객이 그것을 실현하기 위해 특별한 일을 해야 하는 것을 원하지 않았습니다.제 코드는 여기 있습니다.

$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로 건너뜁니다.

글 올려주셔서 감사합니다. 올바른 방향으로 생각하게 해주었습니다.

코드를 업데이트해서 이제 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>';
}

Meteor Slidshow 플러그인을 사용하여 각 페이지에 대한 슬라이드쇼를 만든 다음 해당 페이지의 컨텐츠 영역에 해당 슬라이드쇼에 대한 쇼트코드를 삽입하는 것이 가장 쉬운 작업이라고 생각합니다.예, 각 페이지를 "페이지 편집기 밖"에서 편집해야 하지만 각 슬라이드 쇼에 표시되는 사진과 표시되지 않는 사진을 쉽고 완벽하게 제어할 수 있으며 단축 코드는 페이지 편집기에 입력하기 매우 쉽습니다.

미디어 사용자 정의 필드 플러그인을 사용하면 사용자 정의 게시 필드와 동일하게 미디어 항목에 사용자 정의 데이터를 추가할 수 있으므로 슬라이드쇼 전용 이미지에 플래그를 지정하는 사용자 친화적인 방법을 제공합니다.플러그인 FAQ에서 다음과(와)

사용자 정의 필드를 추가할 수 있는 선택사항을 제공할 뿐만 아니라, 사용자 정의 필드는 모든 적절한 위치에 표시됩니다.미디어 섹션으로 이동하여 미디어를 평소처럼 관리하면 미디어 편집 양식에 표시됩니다.또한 사용자 정의 필드는 이미지를 게시물에 업로드할 때와 다른 모든 예상 위치에 표시됩니다.

은 이 하고 사용자 예: 하고 과 를 입니다 하는 을 은 입니다 하는 를 )를 추가하는 것입니다.Slide가치있는TRUEDashboard(대시보드) -> Media(미디어) 메뉴를 통해 슬라이드 이미지로 이동합니다.그렇다면 필터 코드는 다음과 같습니다.

$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빈 문자열을 제외한 모든 항목에 설정할 수 있습니다.할수다다수를 정의할 수 .Slide어디에선가 급상수처럼 말입니다

이점

  1. 포스터 부분에서 작업이 필요하지 않습니다.
  2. 미래의 증거: 플러그인은 오래된 포스트 기능을 기반으로 하는 것으로 보이며, 첨부 파일은 어쨌든 게시물의 한 종류일 뿐이므로 이상한 것은 없습니다.

여기에 또 다른 접근법이 있습니다.

컨텐츠 영역 안에 삽입된 사진의 크기가 중간 크기, 썸네일 크기 또는 전체 크기일 수 있기 때문에 URL을 사용하는 것을 선호하지 않습니다.따라서 URL만 일치하지 않습니다.

위 코드를 사용하면,

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;

}

기능으로 설정되지 않고 게시물 내부에서 사용되지 않는 영상이 검색됩니다.

성능상의 이유로 페이지가 렌더링되는 동안 코드를 실행하지 않고 save_post hook에 코드를 바인딩합니다.포스트 컨텐츠를 편집하고 저장하면 후크가 호출되고 컨텐츠에 사용되지 않은 모든 첨부 이미지(또는 ID)가 포스트 메타데이터 테이블에 저장됩니다.슬라이더가 렌더링되면 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 );

당신의 문제를 완전히 이해하지는 못했지만, 슬라이드쇼가 있는 사업부 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');

괄호 안의 snumbnail 뒤에 'NAME'을 바꿉니다.도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/8696206/wordpress-excluding-images-inserted-into-post-from-get-children