web-dev-qa-db-ja.com

フロントエンドの並べ替えの質問

私は独学で、できるだけ多くのことを学びます。私はこの問題を研究することから学んだことができる限り多くの情報を試してみるつもりです。

私の目標/問題:クリック可能なリンクまたはドロップダウンフォームを使って、読者が投稿のカテゴリを分類できるようにする。今のところ、クリック可能なリンク「日付順」と「タイトル順」をクリックします。これを達成するにはどうすればよいですか。最善の方法は何ですか?

私が持っているもの - 基本:Stack Exchangeのユーザーのおかげで、私は名前と一致するカテゴリの投稿ページを取得することができました。ページのこのページの名前が[Show Rants]の場合は、[Show Rants]カテゴリのすべての投稿が表示されます。これはこんな感じです(Peter Gさん)。

これは、ページ名= cat名で投稿を取得するときと同じ形式を維持したいので、関係しています。

<?php
$args = [
'category_name' => get_queried_object()->post_name,
'order'         => 'DESC',
'orderby'       => 'date(post_date)' 
// Add any extra parameters you need
];
$q = new WP_Query( $args ); 


// Run the loop
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
get_template_part( 'content', get_post_format() );
}
wp_reset_postdata();
}
?>

上記の例ではWP_Queryを使用していますが、それまではquery_postsを使用していたことに注意する必要があります(大部分は私自身にとって)。

バックエンドでのソートタイプの結果も同様です。今、私はフロントエンドで複数のorderbyをやりたいです。

これは私が遭遇した、あるいは試みたメソッドです:

query_post:以前はquery_postsソートに取り組んでいました。これに関する最初の問題はそれがquery_postsであるということです!今週私はそれが絶対に私が行きたいルートではないことを学びました。 WP_Queryははるかに優れていて安全です。これは私がとにかく持っている総コードです。 2つ目の問題は、ページの名前が付けられたカテゴリからの投稿が召喚されないことです(これは問題の少ない方法です)。

<?php $sort= $_GET['sort'];
if($sort == "title"){
$order= "orderby=title";
}
if($sort == "date"){
$order= "orderby=date";
}
?>

<?php get_header(); ?>

<div class="content-container">

<h2><?php the_title(); ?></h2>

<a href="?sort=title">Sort By Title</a>
<a href="?sort=date">Sort By Date</a>

<?php query_posts($order.'&order=ASC');  ?>

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

<li>    <a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>

    <?php endwhile; 
    endif; 
    wp_reset_query();?>
</ul>

</div>

これをWP_Queryに含めることができれば、すべて設定できます。私はまだそれを考え出すことにかなり限定されていることを除いて。これは私の次の試みがなることだったものです。

WP_Query:上の2つの例と、Codexで学んだことを一緒にして、驚くほどうまくいかないコードを作成しました。それが絶対に間違っていることを私は知っているにもかかわらず、私はとにかくそれを投稿するので、嘲笑を惜しまないでください。 AT ALLの近くにいたかどうかを知りたいのですが。

<?php
$args= [
'category_name' => 'animoo-reviews',
'order'         => 'DESC',
'orderby'       => 'date(post_date)'
];
$A = new WP_Query( $args );

while ( $A->have_posts() ) {
$A->the_post();
echo '<li>' .get_the_title() .'</li>';
}

wp_reset_postdata(); /*instead of wp_reset_query?*/

/* 2nd Query Sort? */
$args2= [
'category_name' => 'animoo-reviews',
'order'         => 'ASC',
'orderby'       => 'title'
 ];

$B = new WP_Query($args2);

// Loop 2?
while( $B->have_posts()) {
$B->the_post();
echo '<li>' .get_the_title() .'</li>';
}

//Restoring original post data
wp_reset_postdata();
?>

問題はそれがうまくいくということです、しかし私がそれが思った方法ではなく、そしてユーザーがソートできるようにそれをどのようにリンクするべきかさえ知らない。私が推測したように、最初の6つの投稿を1つのソート順でポップアウトし、次に別の6つの投稿を別の順序でポップアウトします。もっと近いが、それほど近いわけではない。

編集:うん、私はこれが基本的に単にコーデックスの多重ループの例であることに気づいた。 URLに接続しようとしましたが、うまくいきませんでした。私は少なくとも問題に関連して何かを試みたことを示したいので、ここでそれをそのままにしておきます。 category_nameには、常にget_queried_object-> post_nameを使用できます。以前遊んでいた間、単純化していました。

add_query_arg:何日か調べているうちに、このオプションに何度か遭遇しました。理論的には、人々がそれについて話す方法から、それは簡単に思えます。投稿をソートするURLと、投稿をソートするURLを指定します。そのためにもfunctions.phpファイルを操作する必要があります。私は自分のプロジェクトの別の問題を調べた後、今日これに取り組むことを計画しています。

誰かが私にこれについて取り組む方法を示すことができればそれは際限なく高く評価されるでしょう。私はこれにはかなり慣れていませんが、確かに私は毎日飛躍的に学んでいます。時々物事は私には他の人たちのようにそれほど明白ではないように見える(コーデックスに書かれているもののように)。

繰り返しますが、目標

読者が複数の方法で投稿を分類できるようにする。 (オプションですがcoolbeansになるでしょう)投稿がカテゴリから来ることができるならば、ページは名前が付けられます。

欲しくないもの:

プラグインあなたは先に進んであなたの望む便利なプラグインを提案するかもしれませんが、私は本当にこれをゼロから学ぶ必要があります。すべてのプラグインをつかむことは最初に私の学習を不自由にしようとしているだけです。

もう一度、ありがとうございました。

1
Nimara

orderbyはデフォルトでdateになっているので、日付順に並べたいのであればいつでもそれを省くことができます。そのため、$_GET['sort']が設定されていて、それがtitleと等しいかどうかを検出する必要があります。

ここで、すべてのクエリに対してクエリ引数を設定し、タイトルがorderbyの場合は追加します。

$args = array(
    'category_name' => get_queried_object()->post_name,
    'order'         => 'DESC'
);

if( isset( $_GET['sort'] ) && "title" == $_GET['sort'] ){
    $args['orderby'] = 'title';
}

$q = new WP_Query( $args );
4
Milo