Méthode d'enchaînement de type pagination personnalisé

La pagination de type de message personnalisé vous a déprécié? Rien de plus frustrant dans le développement de WordPress que de faire fonctionner la pagination de type publication personnalisée. J'ai développé une méthode qui résout mes problèmes et je pense que ça va résoudre le tien aussi.


introduction

Alors que je commençais à créer davantage de thèmes WordPress premium, je commençais à développer un thème de base en tant que sorte de cadre sur lequel s'appuyer pour chaque nouveau projet. Le processus se déroulait bien jusqu'à ce que je commence à travailler avec des types de publication personnalisés. C’est là que j’ai inévitablement affronté mon ennemi de longue date, la pagination personnalisée.

Depuis la publication des types de publication personnalisés dans WordPress 2.9, leur pagination s’est révélée difficile en fonction des circonstances. Même les professionnels de WordPress les plus durement frappés ont été déconcertés de temps en temps.

Heureusement, je pense avoir enfin battu une fois pour toutes la pagination personnalisée. J'imagine que je me penche dessus à la lueur du clair de lune, le visage ciselé, un pied posé sur le sol et l'autre fermement contre la poitrine..

Ma clé pour faciliter la pagination de type de message personnalisé consiste à utiliser le archive-posttype.php template pour faire quelque chose que j'appelle chaîner, ce qui signifie que nous les utilisons comme inclus dans d'autres fichiers de template WordPress où la pagination est nécessaire. Cela permet de réduire le développement personnalisé dans différentes circonstances dans lesquelles un développeur souhaiterait une pagination. Pensez-y comme utilisant le modèle d'archive personnalisé de type publication comme index ou attrape-tout. Il y a quelques rebondissements en cours de route, mais c'est la grande idée. Commençons.


Étape 1 Pagination

Puisque le codage est un principe fondamental, commençons par la question de la pagination elle-même. Même si je m'incline devant la grandeur du plugin de pagination, WP PageNavi, comme l'a récemment souligné Jacob Goldman, il n'est vraiment pas nécessaire. WordPress a sa propre fonction de pagination appelée paginate_links () et apparemment, la plupart des développeurs n'en savent rien. Assurez-vous de lire sa documentation, mais pour vous faire gagner du temps lors de la mise au point de votre propre code. functions.php voici le mien semblable à l'exemple du Codex:

function paginate () global $ wp_query, $ wp_rewrite; $ wp_query-> query_vars ['paged']> 1? $ current = $ wp_query-> query_vars ['paginé']: $ current = 1; $ pagination = array ('base' => @add_query_arg ('page', '% #%'), 'format' => ", 'total' => $ wp_query-> max_num_pages, 'current' => $ current, 'show_all' => true, 'type' => 'plain'); if ($ wp_rewrite-> using_permalinks ()) $ pagination ['base'] = user_trailingslashit (trailingslashit (remove_query_arg ('s', get_pagenum_link (1)) ). 'page /% #% /', 'paged'); if (! empty ($ wp_query-> query_vars ['s'])) $ pagination ['add_args'] = array ('s' => get_query_var ( 's')); echo paginate_links ($ pagination);

Ma méthode de chaînage a été développée avec cette fonction en tête. Utiliser WP PageNavi pour la pagination de type de message personnalisé devient vraiment moche, je ne vais donc pas vous montrer comment faire cela pour la même raison, pour que vos amis ne laissent pas leurs amis conduire en état d'ébriété. Vous êtes les bienvenus. Mais passons maintenant à ce que vous êtes vraiment venus faire: trouver enfin comment garder une pagination personnalisée de type publication de manière à ne pas lancer une 404 ou revenir toujours à la première page..


Étape 2: Modèle d'archive de type de message personnalisé

Les types de publications personnalisées n'ayant pas leurs propres pages d'index, et comme je l'ai déjà dit, je pense à la archive-posttype.php modèle en tant que remplaçant, précisément parce que je l'utilise comme fondement de la pagination dans tous les autres modèles. Beaucoup de développeurs insistent d'abord sur un modèle de page en tant que page d'index, mais 1.) je ne suis évidemment pas d'accord et 2.) nous y reviendrons plus tard. Même la superstar de WordPress, Justin Tadlock, convient que les types d'articles personnalisés devraient au moins avoir l'option de leurs propres pages d'index..

Heureusement, ma fonction paginate () sort de la boîte avec le archive-posttype.php modèle. Phew. Mais le problème est que sa pagination est liée au paramètre de publication par page dans Paramètres> Lecture. Et comme les types de publication personnalisés ne sont que cela, chaque développeur souhaite que ses publications par page soient personnalisées neuf fois sur dix. Pour ce faire, le moyen le plus simple que je connaisse consiste à écrire un filtre functions.php comme ça:

function portfolio_posts_per_page ($ query) if ($ query-> query_vars ['post_type'] == 'portfolio') $ query-> query_vars ['posts_per_page'] = 1; return $ query;  if (! is_admin ()) add_filter ('pre_get_posts', 'portfolio_posts_per_page');

Cette méthode m'est venue par le biais du message de Jonathan Christopher intitulé WordPress Posts par page par type de message personnalisé. Merci, Jonathan!

Que se passe-t-il si je ne veux pas que ma structure de lien permanent ait le même nom que mon type de publication personnalisé (par exemple, http://company.com/portfolio/)? Je suis content que vous avez demandé. C'est l'une des raisons pour lesquelles un développeur préfère un modèle de page pour afficher ses types de publication personnalisés. Il donne à l'utilisateur un contrôle total sur la structure de lien permanent, car il peut simplement changer le nom de la page utilisant ce modèle de page. Cela se comprend et nous le ferons bientôt, mais pour ceux d’entre nous qui n’ont pas besoin de le faire ou qui veulent une autre façon de faire à l’avenir, nous pouvons faire un petit montage sous le capot pour plier cette structure à notre volonté..

La fonction permettant de créer un type de publication personnalisé, register_post_type (), accepte un argument appelé rewrite. La valeur de cet argument est transmise sous forme de tableau et la modification de la valeur du slug modifie la structure du lien permanent. Voici un exemple:

'rewrite' => array ('slug' => 'insertyourpermalinknamehere', 'with_front' => true),

Une fois que vous avez changé cela, allez dans Paramètres> Permaliens et cliquez sur le bouton "Enregistrer les modifications" pour vider votre cache de réécriture. Visitez votre site et actualisez la page pour afficher les modifications. Fait et fait. Encore une fois cependant, le seul inconvénient de cette méthode est que les utilisateurs non avertis en technologie ne pourront pas changer le nom de leur structure de permalien depuis l'interface graphique de l'administrateur, à moins bien sûr qu'ils se tournent vers l'éditeur de thème pour modifier ce slug de réécriture..


Étape 3 Modèles de page

Il n'est pas rare que les développeurs affichent et paginent leurs types de publication personnalisés dans une page d'accueil statique à l'aide d'un modèle de page. La raison en est double; cela donne à l'utilisateur la capacité de changer de nom de structure permalien dont nous venons de parler et cela lui permet d'afficher des types de publication personnalisés sur la page d'accueil de son site. Mais les choses peuvent devenir laides ici. J'ai honte de dire que j'ai déjà codé une pagination de type publication personnalisée de trois manières différentes dans un même thème. Ceci est en partie dû à l’utilisation de WP PageNavi, mais je tiens à ce fait embarrassant de souligner que tout ce processus peut être accablant pour les développeurs de thèmes qui ne sont pas au courant..

Appelons notre modèle de page page-portfolio.php pour correspondre à la convention de dénomination des modèles de type de publication personnalisés, même si ce n'est pas le cas. Voici le code:

/ * Nom du modèle: Portfolio * / $ paged = 1; if (get_query_var ('paginé')) $ paged = get_query_var ('paginé'); if (get_query_var ('page')) $ paged = get_query_var ('page'); query_posts ('& post_type = portfolio & paged ='. $ paged); require_once ('archive-portfolio.php');

C’est la première fois que vous voyez le archive-posttype.php modèle chaîné à un autre modèle. Et il fonctionne! Mais que diable se passe-t-il? Cette variable janky $ paged business met en évidence le problème exact que les développeurs semblent rencontrer avec la pagination de type publication personnalisée. Fondamentalement, si ce correctif (toux) n’est pas en place et si un utilisateur clique pour afficher la page 2, WordPress est confus et ne sait pas où il se trouve. Et pour ajouter une insulte à la blessure apparemment, WordPress le sait et l'accepte comme procédure de développement normale en publiant cette note dans la section Paramètres de pagination de la page Codex pour WP_Query ():

Remarque sur la pagination: Vous devez définir get_query_var ('page'); si vous voulez que votre requête fonctionne avec la pagination. Depuis WordPress 3.0.2, vous obtenez get_query_var ('page') au lieu de get_query_var ('paged'). Le paramètre de pagination 'paginé' pour WP_Query () reste le même.

Il me semble logique que les développeurs soient en mesure de définir cette variable et de pointer vers une page spécifique. Ce qui n’a pas de sens, c’est pourquoi la pagination fonctionne de manière inhérente avec les types de publication par défaut (publication, page, pièce jointe), mais pas avec les types personnalisés..

Outre le fait de patcher le code, il existe un autre inconvénient: vous ne pouvez pas appeler votre slug de page de la même façon que votre slug de type message personnalisé. Pensez à votre slug de type de message personnalisé en tant que mot clé réservé; Toutefois, vous pouvez attribuer au titre de votre page le même nom que votre slug de type de message personnalisé, à condition que votre slug de page soit différent..


Étape 4 Modèle de page de garde

En utilisant le front-page.php Le modèle verrouille les utilisateurs sur une page d'accueil personnalisée sans possibilité de la modifier (à moins qu'ils ne suppriment le fichier ou ne le renomment temporairement). C'est pourquoi la plupart des développeurs optent pour la méthode de modèle de page pour la création de pages statiques, mais, dans l'intérêt de ma méthode, supposons que nous utilisons l'ancienne. Pour réaliser une pagination de type de publication personnalisée pour ce modèle, il suffit d’inclure ce que nous avons fait pour archive-posttype.php comme ça:

require_once ('page-portfolio.php');

Étape 5: taxonomies par type de message personnalisé

le taxonomy-posttype-taxonomy.php modèle fonctionne de la même manière que le front-page.php modèle, mais au lieu d'inclure le page-portfolio.php modèle, vous allez plutôt inclure notre index, archive-posttype.php, comme ça:

require_once ('archive-posttype.php');

Cela complète l’étendue de ma méthode. Là où je frappais une fois la tête contre le bureau à deux heures du matin, je me déplace maintenant calmement dans les projets à deux heures de l'après-midi. La victoire! Au moins pour le moment. Je ne suis pas assez naïf pour penser que je ne me retrouverais peut-être pas dans une situation où cette méthode ne fonctionnerait pas pour la pagination de type de message personnalisé, mais je ne l'ai pas encore.


Conclusion

Contrairement à mes autres publications, j'espère que celle-ci sera obsolète. Mon espoir est que WordPress réponde à la récente enquête, qui montre que 92% des développeurs utilisent WordPress en tant que système de gestion de contenu et se penche pour la deuxième fois sur le fonctionnement de la pagination sur leur plate-forme. L'équipe de WordPress n'est rien de moins que professionnelle. J'imagine un avenir dans lequel des outils de pagination intégrés et éventuellement une page d'administration de type publication personnalisée sont disponibles sous Paramètres d'administration des publications par page et par type de publication personnalisée. Mais pour le moment, j'espère que cette méthode de chaînage aidera les nombreux développeurs que j'ai vus souffrir sur les forums WordPress. N'hésitez pas à télécharger, utiliser et abuser des fichiers compressés suivants comme structure pour une pagination réussie de type publication. Prendre plaisir!