web-dev-qa-db-ja.com

1ページに11の投稿とCSSスタイリングを含めるようにarchives.phpのループを変更する方法

ページ付けとカテゴリ投稿リストウィジェットを操作するために、archives.phpのループを編集しました。私は基本的にランダムなコードとアイデアからそれをすべてまとめました。そして今ではデフォルトのpost queryからは程遠いので、二乗りに戻るのに苦労しています。二乗する必要があるのは、2つのことが必要だからです。

1)投稿に2つのカテゴリタグがある場合、私のコードでカテゴリ投稿がめちゃくちゃになっています。それが起こると、彼らは間違ったカテゴリに入れられます(またはまったく配置されません)。

2)このカスタムコーディングを行うことで、 'tags'に対するクエリも失い、タグページは正しく機能しません。

正しく表示されるようにタグとカテゴリの投稿を設定できるように、正方形に戻る必要があります。ただし、スタイルは正しい<li>s内にあります。間違っていなければset_post_thumbnail_size();the_title();the_excerpt()などを呼び出して自分のリスト項目をスタイルすることができるので、私はもうCategory Post Listウィジェットさえ必要とするかどうかわからない。

とにかく、これが私が手に入れたコードです、私は私が行く必要があるところに戻るためにそれの束をスクラブする必要があると思います。ご協力ありがとうございました。本当に感謝しています。

<?php if (have_posts()) : ?>

<ul style="list-style-type:none;">

<?php
if ($paged == 0)
  $offset = 0;
else
  $offset = ($paged - 1) * 11;
global $post;
$category = get_the_category($post->ID);
$category = $category[0]->cat_ID;
$myposts = get_posts(array('numberposts' => 11, 'offset' => $offset, 'category__in' => array($category), 'post__not_in' => array($post->ID),'post_status'=>'publish'));
foreach($myposts as $post) :
setup_postdata($post);
?>


<li id="category_li">
    <div id="image_con">
        <div id="image_recent">
        <a href="<?php the_permalink(); ?>"><?php set_post_thumbnail_size( 200, 200 );
the_post_thumbnail(); ?></a>
        </div>
    </div>

    <div id="cr_content">
    <a href="<?php the_permalink(); ?>">
    <div class="gloss_glam_font"> <?php the_title(); ?></div>
    <hr>
    <div class="excerpt_cat"><?php the_excerpt(); ?></div>
    </a>
    </div>

    <div id="clearfix">
    </div>
</li>

<?php endforeach; ?>
<?php wp_reset_query(); ?>
</ul>


<?php while (have_posts()) : the_post(); ?>

<?php endwhile; ?>

<?php if (function_exists("pagination")) {
    pagination($additional_loop->max_num_pages);
} ?>
    <?php else :

        if ( is_category() ) { // If this is a category archive
        printf("<div class='post-content'><p><em><strong>Not Found:</strong> Sorry, but there aren't any posts in the &middot;<strong>%s</strong>&middot; category yet.</em></p></div>", single_cat_title('',false));
    } else if ( is_date() ) { // If this is a date archive
        echo("<div class='post-content'><p><em><strong>Not Found:</strong> Sorry, but there aren't any posts with this date.</em></p></div>");
    } else if ( is_author() ) { // If this is a category archive
        $userdata = get_userdatabylogin(get_query_var('author_name'));
        printf("<div class='post-content'><p><em><strong>Not Found:</strong> Sorry, but there aren't any posts by &middot;<strong>%s</strong>&middot; yet.</em></p></div>", $userdata->display_name);
    } else {
        echo("<div class='post-content'><p><em>No posts found.</em></p></div>");
    }

endif; ?>

編集

さて、私はそれを編集しました、そして、私は私がどこを離れているのかわからない。ここではtag.phpテンプレートを例として使用しています(category.phpではありません)。これまでに行ったことがあります(答えにChipが提供したコードを基にしています)。

function wpse63424_filter_pre_get_posts( $query ) {
    if ( ! is_main_query() ) {
        return $query;
    } else {
        if ( is_category() || is_tag() ) {
            $query->set( 'posts_per_page',11 );
        }
        return $query;
    }
}
add_filter( 'pre_get_posts', 'wpse63424_filter_pre_get_posts' );

$tag = get_query_var('tag');
$myposts = get_posts('tag__in' => array($tag));
foreach($myposts as $post) :
setup_postdata($post);

私は、1ページに11件の投稿のフィルタを設定し、特定のタグを検索し、その投稿をその配列のタグに設定してから、それに応じて投稿を設定することを考えました。 get_posts()を実行したばかりです。それは1ページあたり11の投稿をフィルタリングせずに返しますので、私はChipのコードが問題なく動作することを知っています。関数がどのように正しく呼び出されるのかまだ理解できていないと思います….

5
MxmastaMills

まず、レイアウトとCSSスタイルのために、カスタマイズしたいコンテキストには テンプレートファイル を作成することをお勧めします。つまり、カテゴリとタグインデックスのアーカイブページにそれぞれcategory.phptag.phpを作成します。どちらの場合でも、archive.phpをコピーし(または、存在しない場合はindex.phpをコピーし)、コピーの名前をcategory.phpに変更します。その後、必要に応じてマークアップを修正します。

CSSの場合は、必ずテーマでbody_class()を使用してから、*カテゴリとタグベースの <body>タグに適用されるCSSクラス を使用できます。

次のステップでは、カテゴリ/タグアーカイブインデックスページに対して、10ページではなく10ページの投稿を出力するようにクエリをカスタマイズします。そのためには、pre_get_postsフィルターを使用してください。次のコールバックとadd_filter()呼び出しをfunctions.phpに追加します。

function wpse63424_filter_pre_get_posts( $query ) {
    if ( ! is_main_query() ) {
        return $query;
    } else {
        if ( is_category() || is_tag() ) {
            $query->set( 'posts_per_page',11 );
        }
        return $query;
    }
}
add_filter( 'pre_get_posts', 'wpse63424_filter_pre_get_posts' );

このコールバックはWordPressに伝えます:

  1. クエリが main クエリではない場合は、変更せずに返します。 (これにより、[最近の投稿]ウィジェットクエリ、ナビゲーションメニューなどに影響が及ぶのを防ぐことができます。)
  2. 現在のページがカテゴリアーカイブインデックスまたはタグアーカイブインデックスの場合は、'posts_per_page'クエリ変数を11に変更してからクエリを返します。
8
Chip Bennett

最新バージョンのWP(4.4以降)で何かが変更されたかどうかはわかりませんが、is_main_query()はそのままfalse positiveを返します。そのはず:

function wpse63424_filter_pre_get_posts( $query ) {
    if ( ! $query->is_main_query() ) {
        return $query;
    } else {
        if ( is_category() || is_tag() ) {
            $query->set( 'posts_per_page',11 );
        }
        return $query;
    }
}
add_filter( 'pre_get_posts', 'wpse63424_filter_pre_get_posts' );
1
darrinb