S'il vous plaît nu avec moi que je suis autodidacte et essayant d'apprendre autant que possible. Je vais essayer de fournir autant d'informations que possible que j'ai apprises en recherchant ce problème.
Mon objectif/le problème : Permettre aux lecteurs de trier une catégorie de messages en utilisant un lien cliquable ou un formulaire déroulant. Pour le moment, nous allons simplement nous en tenir aux liens cliquables "Trier par date" et "Trier par titre". Comment puis-je accomplir ceci? Quelle est la meilleure méthode pour le faire?
Ce que j'ai - La base : Grâce aux utilisateurs de Stack Exchange, j'ai pu récupérer une page de messages dans une catégorie correspondant au nom. de la page. Si la page s'appelle Show Rants, elle crache tous les articles de la catégorie Show Rants. Voici à quoi cela ressemble (merci Peter G).
Ceci est lié car je voudrais conserver le même format de récupération des publications par nom de page = nom de chat.
<?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();
}
?>
Dans l'exemple ci-dessus, nous utilisons WP_Query, qu'il est important pour moi de noter (principalement pour moi-même), car j'utilisais jusqu'à présent query_posts.
Ainsi est le résultat d'un type de tri sur le backend. Maintenant, je veux faire une commande multiple sur le front-end.
Voici les méthodes que j'ai rencontrées ou tentées:
query_post : Je travaillais auparavant sur un tri query_posts qui fonctionnait. Le premier problème avec ceci est qu'il s'agit de query_posts! Cette semaine, j'ai appris que ce n'est certainement pas la route que je veux emprunter. WP_Query est beaucoup plus supérieur et plus sûr. Voici le code brut que j'ai de toute façon. Le deuxième problème est qu'il n'appelle pas les publications de la catégorie qui a donné son nom à la page (ce qui pose moins de problèmes).
<?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>
Maintenant, si je pouvais obtenir que ceci soit dans WP_Query, alors nous pouvons être tous prêts. Sauf que je suis encore plutôt limité à comprendre cela. C'est ce que ma prochaine tentative allait être.
WP_Query: Frankensteining les deux exemples ci-dessus avec ce que j'ai appris dans le Codex, j'ai créé un code qui sans surprise ne fonctionne pas. Même si je sais que c'est absolument faux, je le posterai quand même, alors évitez le ridicule. Je voudrais savoir si j'étais proche 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();
?>
Le problème est que cela fonctionne, mais pas comment je le pensais et je ne sais même pas comment le lier afin que l'utilisateur puisse trier. Comme j'aurais dû le deviner, les 6 premiers messages seront affichés dans un ordre de tri puis 6 autres dans l'ordre. Plus près, mais pas vraiment si proche.
Edit: Woops, j’ai réalisé que c’était tout simplement l’exemple du Codex à boucles multiples. J'ai essayé de le connecter aux urls mais cela n'a pas fonctionné. Je vais le laisser ici car je veux montrer que j'ai au moins tenté quelque chose en relation avec le problème. Pour category_name, je peux toujours utiliser get_queried_object-> post_name. Je me contentais de le simplifier alors que je jouais auparavant.
add_query_arg : En poursuivant des jours de recherche, je suis tombé sur cette option à quelques reprises. En théorie, de la façon dont les gens en parlent, cela semble facile. Donnez une URL qui triera les publications d'une manière et une autre URL qui triera les publications d'une autre manière. Je dois aussi manipuler le fichier functions.php. Je prévois d’y remédier aujourd’hui après avoir examiné un autre problème pour mon projet.
Il serait infiniment apprécié que quelqu'un puisse me montrer le chemin à suivre. Je suis plutôt nouveau dans ce domaine, mais j’apprends vraiment tous les jours. Parfois, les choses ne me semblent pas aussi évidentes que d’autres (comme ce qui est écrit dans le Codex).
Encore une fois, l'objectif :
Permettre aux lecteurs de trier les articles de plusieurs manières. (Facultatif mais cela serait coolbeans) Si les publications peuvent provenir de la catégorie pour laquelle la page est nommée.
Ce que je ne veux pas:
Un plugin. Vous pouvez y aller et suggérer un plugin pratique que vous souhaitez, mais je dois vraiment apprendre cela de la base. Saisir un plugin pour tout ne va que paralyser mon apprentissage au début.
Merci encore une fois pour votre temps.
orderby
défaut à date, nous pouvons donc toujours laisser cela de côté si nous voulons commander par date. La seule chose à détecter est donc si $_GET['sort']
est défini et égal à title.
ici, nous définissons les arguments de la requête pour toutes les requêtes, et ajoutons simplement la valeur orderby
si c'est title:
$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 );