web-dev-qa-db-ja.com

ギャラリー画像を取得する方法

私はいくつかの画像をワードプレスの投稿にアップロードしています(例:投稿#1、投稿#2)。今、私は新しい投稿を作成し(例Post#3)、この投稿にWordPress 3.5ギャラリーを挿入しました。投稿#3には画像をアップロードせず、代わりに投稿#1の画像を使用しましたそして投稿#2。今投稿#3で、私は画像へのリンクを取得したいのですが、私は得ることができないようです。私は次のコードを使っています。

$attachments = get_children( array('post_parent' => get_the_ID(), 'post_type' => 'attachment', 'post_mime_type' =>'image') );
    foreach ( $attachments as $attachment_id => $attachment ) {
            echo wp_get_attachment_image( $attachment_id, 'medium' );
   }

投稿にアップロードした場合は画像のみが表示されますが、他の投稿から追加した場合は画像は表示されません。では、ギャラリーには追加されているがアップロードされていない画像へのリンクを取得する方法はありますか。

助けてくれてありがとう。

4
jay

私は同じ問題を抱えていました - ギャラリーを含む投稿からすべての画像を表示するにはどうすればいいですか。

WP3.5の新しいメディアインターフェースでは、それらが「添付」されているかどうかにかかわらず、メディアライブラリ内の任意の画像をギャラリーに追加できます。ご存知のとおり、 "get_children"関数は投稿に添付されている画像のみを返します。私が使ったトリックは、それらが添付ファイルであるという事実からではなく、[gallery]ショートコード自体からIDを取得することです。ショートコードには、投稿に添付されているかどうかにかかわらず、すべての画像IDが含まれます。例えば。 [gallery id = "410,411,412,413,414,415"]。明らかに、wordpressはこれを解析してすべての画像を検索し、wordpressのコア(includes/media.php)に含まれる "gallery_shortcode"関数を使用してそれらをギャラリー形式で表示することができます。 [gallery]の短いコードですべての画像のIDを取得するために、functions.phpファイルに新しい関数を追加しました。

function grab_ids_from_gallery() {

global $post;
$attachment_ids = array();
$pattern = get_shortcode_regex();
$ids = array();

if (preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches ) ) {   //finds the     "gallery" shortcode and puts the image ids in an associative array at $matches[3]
$count=count($matches[3]);      //in case there is more than one gallery in the post.
for ($i = 0; $i < $count; $i++){
    $atts = shortcode_parse_atts( $matches[3][$i] );
    if ( isset( $atts['ids'] ) ){
    $attachment_ids = explode( ',', $atts['ids'] );
    $ids = array_merge($ids, $attachment_ids);
    }
}
}
  return $ids;

 }
add_action( 'wp', 'grab_ids_from_gallery' );

"grab_ids_from_gallery()"関数を使用して、すべてのIDをテンプレートの配列として返します。

もっとエレガントな方法があると確信しています - しかしこれは私には有効です。このコードの基礎は次のとおりです。

http://core.trac.wordpress.org/ticket/22960

これはこの問題について説明します。

5
steveO

3.5の新しいメディアギャラリーなどで遊ぶ時間がなかったことを認めなければなりませんが、WPのギャラリー機能に関係なく、コードだけで作業しています...

指定したコードは、クエリ変数post_parentget_children()(コンテンツループで現在処理されている投稿オブジェクトのID)に設定されたget_the_ID()を使用します。そのため、get_children()への呼び出しは、現在の投稿への添付ファイルのみをクエリでき、その他はクエリできません。

例の用語では、コードがPost#の処理中にループのコンテキストで実行されると、Post#1および-に添付された添付ファイルを取得できません。 Post#2は、Post#に添付されている添付ファイルを明確に要求しているためです。

残念ながら、Wordpressはnotが複数の値をpost_parentクエリ変数に渡すことをサポートしているため、添付ファイルを取得するために希望する方法で他の投稿から、添付ファイルを含む投稿(Post#1およびPost#2)の投稿IDを取得し、実行する必要があります。それぞれのget_children()を呼び出し、「get_the_ID()」のpost_parent値をそれぞれのIDに置き換えます。

WP_Query オブジェクトを巧妙に使用することで、より効率的な(理論的にはより複雑な)ソリューションが可能になる場合がありますが、あなたが探しているソリューション(またはあなたが探していると思う-実際に尋ねたことはないと思います)質問;))の線に沿って何かを見るだろう

$attachmentParentIds = getAttachmentParentIds( get_the_ID() );
foreach( $attachmentParentIds as $attParentId ) {
    $attachments = get_children( array('post_parent' => $attParentId, 'post_type' => 'attachment', 'post_mime_type' =>'image') );
    foreach ( $attachments as $attachment_id => $attachment ) {
        echo wp_get_attachment_image( $attachment_id, 'medium' );
    }
}

次のような関数を使用します

//Returns an array of post IDs containing attachments that should be displayed
//on the post indicated by the passed post ID.
function getAttachmentParentIds( $intPostId ) {
    $ids = array();

    //Figure out which posts contain attachments that need to be displayed for $intPostID

    //...

    return $ids; //return an array of IDs
}

渡された投稿IDに対して表示する必要がある添付ファイルをどの投稿に含めるかを決定するロジックのプレースホルダーとして。私はあなたの実装やアプリケーションの範囲に関して積極的ではありません。そのため、そのロジックの詳細があなたのプロジェクトに関して何を伴うのかわかりません。

0
bosco

本当の解決策はそれ自身のIDを持つ新しい "本当の"オブジェクト "ギャラリー"を作成することでしょう。

ギャラリーは画像IDの配列にすぎませんが、管理が簡単です。

  • WP 3.5.xで新しい "ギャラリー"を作成するのと同じ方法で、Media Managerから直接作成できます。[gallery ids = "xx、yy、zz "]それは単に新しい" Gallery " それ自身のidを持つ を作成してこれをこのように呼ぶことができます:[gallery galley_id =" 123 "]

  • 新しい「ギャラリー」セクションで、メディアの下にある「本物のギャラリー」オブジェクトを管理できます。

  • そのようなオブジェクトを管理するための一連の機能があります。そのようにして、OPの問題は、対応する関数を使用して、attachment.phpテンプレート(または実装可能な新しいgallery.phpテンプレート)で使用するgallery_idを渡すだけで解決されます。

  • 元の投稿を気にせずに、ギャラリーオブジェクトのさまざまな投稿に添付されている写真を混同することができます。

  • あなたは簡単に1つの投稿に複数のギャラリーを追加することができます。

あなたがそれについて考えるならば、これは一言で言えばNextGenギャラリーです。人々がそのプラグインを多用するのも不思議ではありません。残念ながら、私はそのような重要な機能がプラグイン、特にNextgenのようにかなり肥大化した、重い機能をたくさん余計に詰め込んだものに先送りされるべきではないと思います。

この意味で、新しいメディアマネージャのロジックには少し欠陥があります。それはちょっとあなたがgalleryと呼ばれる新しい実体を「作成」している間それが実際にあなたのためにたくさんの画像idを一緒にマージしていることをお勧めします。

JetpackのCarouselディスプレイを使用している場合は、現在のページから出ることはなく、作成した特定のギャラリーに画像を関連付ける必要がないため、この欠陥は表示されません。 ".

それにもかかわらず、私は新しいメディアマネージャのUIとギャラリーを表示するために実際に何をするかの間に危険なギャップがあると思います。

0
CamilloMiller