web-dev-qa-db-ja.com

ギャラリーとして二次クエリで添付ファイルをページ分割する方法は?

私の投稿タイプに添付されているすべての画像を表示するこのコードがあります。それらをページ付けする方法はありますか?私は25枚の写真が好きで、できる限りスクロールを避けたくありません。

コード:

<div class="galleries ten columns">
<?php
    $attachments = get_posts( array( 
   'post_type' => 'attachment',
   'post_mime_type'=>'image',
   'posts_per_page' => -1,
   'post_status' => 'any',
   'post_parent' => $post->ID)
);
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
    $src = wp_get_attachment_image_src( $attachment->ID, full);     
    $html = '<a class="fancybox" href="'.$src[0].'">';
    $html .= wp_get_attachment_image( $attachment->ID, 'gallery-thumb') .'</a>';
    echo $html;
}
}
?>
</div>

ありがとうございます。

4
Cynthia Lara

私はあなたがこのようなものが欲しいと思う:

|---------------------|   
|       content       |  
|       (static)      |  
|---------------------|  
|       gallery       |  
|       (paged)       |  
|---------------------|  
|   << pagelinks >>   |  
|---------------------|  

この設定では、ギャラリーがページングされている間、あなたの投稿コンテンツは同じままで、静的に見えます。つまり、タイトル、コンテンツなどを表示するメインのクエリと、ギャラリーの画像を表示する役割を担う2番目のクエリがあります。このページのページリンクは2次ループに接続されており、そこでページングを行います。これを実現するには、get_posts()の代わりに WP_Query を使用することをお勧めします。後者の解決策を念頭に置いていないだけでなく、それが一般的により良いアプローチであると考えるためです。最初のステップでは、ページネーションに使用される新しいクエリ変数を設定する必要があります。関数add_gallery_query_var()はあなたのfunctions.phpに入ります。

コード:

    add_filter('init', 'wpse124169_attachment_gallery_add_query_var');
    function wpse124169_attachment_gallery_add_query_var() {
        global $wp;
        $wp->add_query_var('gallery_page');
    }


さらに、新しいパーマリンクを新しいクエリ変数で機能させたい場合は、新しいリライトルールを実装する必要があります。これには、 add_rewrite_tag および add_rewrite_rule を使用するfunctions.phpに以下を追加します。

コード:

    add_filter('init', 'wpse124169_attachment_gallery_add_rewrite_tag_rule');
    function wpse124169_attachment_gallery_add_rewrite_tag_rule() {
        add_rewrite_tag('%gallery_page%','([^&]+)');
        add_rewrite_rule('([^/]+)/gallery/image//?([0-9]{1,})/?$', 'index.php?name=$matches[1]&gallery_page=$matches[2]', 'top');
    }


次のステップはギャラリーの二次ループを作成することです。 WP_Query はそうするのに使用されます、さらに paginate_links は私達にギャラリーを通してページングするためのリンクを作成する可能性を与えます。このための関数を作成することにしたので、以下のコードはfunctions.phpに入ります。

コード:

function wpse124169_get_attachment_gallery() {
    global $post;
    $gallery_page = (get_query_var('gallery_page')) ? get_query_var('gallery_page') : 1;
    $args = array(
        'posts_per_page' => 1, 
        'orderby' => 'menu_order', 
        'order' => 'ASC', 
        'post_type' => 'attachment',
        'post_status' => 'inherit', 
        'post_mime_type' => 'image', 
        'post_parent' => $post->ID, 
        'paged' => $gallery_page
    ); 
    $gallery = new WP_Query($args);
        if ( $gallery->have_posts() ) :
            echo '<div class="my_cpt_gallery_paged">';
                    while ( $gallery->have_posts() ) : $gallery->the_post();
                        echo wp_get_attachment_image( $post->ID, 'medium' );
                    endwhile;
            echo '</div>';
            echo '<div class="my_cpt_gallery_paginate_links">';
                    if ( get_option('permalink_structure') ) {
                        $format = 'gallery/image/%#%';
                    } else {
                        $format = '&gallery_page=%#%';
                    }
                    $args = array(
                        'base' => get_permalink( $post->post_parent ) . '%_%',
                        'format' => $format,
                        'current' => $gallery_page,
                        'total' => $gallery->max_num_pages
                    );
                    echo paginate_links( $args );
                    wp_reset_postdata();
            echo '</div>';
        endif;
}


ご覧のとおり、2次照会では、追加のポスト・オブジェクト$galleryおよびその前に定義された照会変数 - gallery_pageを使用して、適切なページ区切りを使用可能にしています。後者はpaginate_links()formatパラメータを設定するために使用されます。問題を防ぐために、wp_reset_postdata()をリセットすることを忘れないでください。もちろんこれは単なる二次ループであり、完全なテンプレートではありません。

私は、メインのクエリ/ループの後に、関数wpse124169_get_attachment_gallery()を介して、私のsingle.php内の二次添付ファイルギャラリークエリを呼び出します。上記の手順に従って、ページ付けされた添付ファイルギャラリーを設定します。私はテスト済みこれを使っていますが、うまくいきました。




以下に私は最も重要な情報と情報源をリストします、あなたがより多くの詳細に興味があるなら、これはあなたがもっとそれを始めたばかりになるはずです。

情報:

  1. WP_Query
  2. paginate_links
  3. クラスWP/source/add_query_var
  4. 書き換えAPI
  5. add_rewrite_tag
  6. add_rewrite_rule
  7. ページ区切り付きの複数のWP_Queryループ
  8. 複数のループに個別のページ区切りを作成する方法




省略可

つまり、最初の画像のデフォルトリンクを変更します。通常は添付ファイルの親であるhttp://site.ext/?p=123またはhttp://site.ext/post-name/です。それは大丈夫です、それはあなたにデフォルトで最初の画像が表示されます。最初の画像へのリンクがURLのギャラリークエリvarを表すようにしたい場合は、but _ paginate_linksにフックする必要があります。これはリンクがこのhttp://site.ext/?p=123&gallery_page=1またはhttp://site.ext/post-name/gallery/image/1のように解釈されることにつながります。これは、paginate_links()によるリンクを介したナビゲーションにのみ適用されます。親の投稿を呼び出しても、対応する親のパーマリンクのみが表示されます。コードはfunctions.phpにも入ります。

コード:

add_filter( 'paginate_links', 'wpse124169_attachment_gallery_first_image_link' );
function wpse124169_attachment_gallery_first_image_link( $link ) {
    global $post;
    if ( get_option('permalink_structure') ) {
        $gpg_num = substr( strrchr( $link, '/' ), 1 );
    } else {
        $gpg_plk = wp_parse_args($link);
        $gpg_num = $gpg_plk['gallery_page'];
    }
    if ( empty( $gpg_num ) ) {
        if ( get_option('permalink_structure') ) {
            $link = get_permalink( $post->post_parent ) . 'gallery/image/1';
        } else {
            $link = get_permalink( $post->post_parent ) . '&gallery_page=1';
        }
    }

    return $link;
}




更新:

これは、次に示すように[gallery]ショートコードを変更するために使用できます。 wordpress [gallery]ショートコードをページ分割する方法?

7
Nicolai