¿La paginación de tipo de publicación personalizada te ha decepcionado? No ha habido nada más frustrante en el desarrollo de WordPress que hacer que la paginación de tipo de publicación personalizada funcione. He desarrollado un método que resolvió mis problemas y creo que también resolverá el tuyo.
A medida que comencé a crear más temas premium de WordPress, comencé a desarrollar un tema base como una especie de marco para construir con cada nuevo proyecto. El proceso fue bueno hasta que comencé a trabajar con tipos de publicaciones personalizados. Ahí es cuando inevitablemente me enfrenté a mi enemigo de mucho tiempo, paginación de tipo de publicación personalizada.
Desde el lanzamiento de los tipos de correos personalizados en WordPress 2.9, su paginación ha resultado difícil dependiendo de las circunstancias. Incluso los profesionales de WordPress que golpean pesadamente se han quedado perplejos de vez en cuando.
Afortunadamente, siento que finalmente he superado la paginación de tipo de publicación personalizada de una vez por todas. Me imagino a mí mismo flexionándome sobre el resplandor de la luz de la luna, con mi cara cincelada, un pie plantado en el suelo y el otro firmemente sobre su pecho..
Mi clave para una fácil paginación de tipo de publicación personalizada es usar el archivo-posttype.php plantilla para hacer algo que llamo encadenamiento, lo que significa que los usamos como incluidos en otros archivos de plantilla de WordPress donde se necesita la paginación. Lo que esto hace es reducir el desarrollo personalizado para diferentes circunstancias en las que un desarrollador querría paginación. Piense en ello como el uso de la plantilla de archivo de tipo de publicación personalizada como un índice o catch-all. Hay algunos giros en el camino, pero esa es la gran idea. Vamos a empezar.
Dado que la codificación es una base científica, comencemos con el tema de la paginación en sí. Aunque me inclino ante la grandeza del complemento de paginación, WP PageNavi, como señaló recientemente Jacob Goldman, realmente no hay necesidad de hacerlo. WordPress tiene su propia función de paginación llamada paginate_links () y aparentemente la mayoría de los desarrolladores no saben nada al respecto. Asegúrese de leer su documentación, pero para ahorrarle tiempo de diseñar su propio código para funciones.php Aquí está la mía similar al ejemplo del Codex:
function paginate () global $ wp_query, $ wp_rewrite; $ wp_query-> query_vars ['paged']> 1? $ current = $ wp_query-> query_vars ['paged']: $ 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);
Mi método de encadenamiento se ha desarrollado con esta función en mente. El uso de WP PageNavi para la paginación del tipo de publicación personalizada se vuelve muy feo, así que no te mostraré cómo hacerlo por la misma razón por la que los amigos no dejan que los amigos conduzcan borrachos. De nada. Pero avancemos a lo que realmente buscó: finalmente, descubra cómo evitar que la paginación de tipo de publicación personalizada lance un 404 o vuelva siempre a la página uno..
Dado que los tipos de publicación personalizados no tienen sus propias páginas de índice, y como dije antes, pienso en el archivo-posttype.php La plantilla como soporte, específicamente porque la uso como la base para la paginación en todas las demás plantillas. Muchos desarrolladores primero enfatizarán una Plantilla de Página como una página de índice, pero 1.) obviamente no estoy de acuerdo y 2.) llegaremos a eso más adelante. Incluso la superestrella de WordPress, Justin Tadlock, está de acuerdo en que los tipos de publicaciones personalizadas deberían tener al menos la opción de sus propias páginas de índice.
Afortunadamente, mi función paginate () sale de la caja con el archivo-posttype.php modelo. Uf. Pero el problema es que su paginación está limitada por la configuración de publicaciones por página en Configuración> Lectura. Y como los tipos de publicaciones personalizadas son solo eso, personalizadas, nueve veces de cada diez, un desarrollador querrá que sus publicaciones por página también sean personalizadas. Para hacer esto, la forma más fácil en que he venido es escribiendo un filtro en funciones.php Me gusta esto:
function portfolio_posts_per_page ($ query) if ($ query-> query_vars ['post_type'] == 'portfolio') $ query-> query_vars ['posts_per_page'] = 1; devuelve $ consulta; if (! is_admin ()) add_filter ('pre_get_posts', 'portfolio_posts_per_page');
Este método me llegó por medio de la publicación de Jonathan Christopher, llamada WordPress, publicaciones por página, por tipo de publicación personalizada. Gracias, Jonathan!
¿Qué sucede si no deseo que mi estructura de enlace permanente tenga el mismo nombre que mi tipo de publicación personalizada (por ejemplo, http://company.com/portfolio/)? Me alegra que hayas preguntado. Esta es una de las razones por las que un desarrollador prefiere una plantilla de página para mostrar sus tipos de publicaciones personalizadas. Le da al usuario el control total sobre la estructura de enlace permanente porque simplemente pueden cambiar el nombre de la página que usa esa plantilla de página. Eso es comprensible y lo haremos pronto, pero para aquellos de nosotros que no necesitamos hacer eso o queremos otra forma en el futuro, hay una pequeña edición que podemos hacer bajo el capó para doblar esa estructura a nuestra voluntad..
La función para crear un tipo de publicación personalizada, register_post_type (), acepta un argumento llamado reescribir. El valor de ese argumento se pasa como una matriz y al cambiar el valor de la bala cambiará la estructura del enlace permanente. Aquí hay un ejemplo:
'rewrite' => array ('slug' => 'insertyourpermalinknamehere', 'with_front' => true),
Después de que hayas cambiado esto, ve a Configuración> Permalinks y pulsa el botón "Guardar cambios" para volcar tu caché de reescritura. Visite su sitio y actualice la página para ver el cambio. Hecho y hecho. Sin embargo, una vez más, la única desventaja de este método es que los usuarios que no son expertos en tecnología no podrán cambiar el nombre de su estructura de enlace permanente desde la GUI del administrador, a menos que, por supuesto, se dirijan al Editor de temas para cambiar esa barra de reescritura..
No es raro que los desarrolladores muestren y paginen sus tipos de publicaciones personalizadas en una página principal estática mediante una plantilla de página. La razón de esto es doble; le da al usuario la capacidad de cambio de nombre de la estructura de enlace permanente del que acabamos de hablar y le permite mostrar tipos de publicaciones personalizadas en la página principal de su sitio. Pero las cosas pueden ponerse feas aquí. Me avergüenza decir que una vez codifiqué la paginación de publicación personalizada de tres maneras diferentes en un tema. Esto se debe en parte al uso de WP PageNavi, pero me duele este hecho vergonzoso para subrayar que todo este proceso puede ser abrumador para los desarrolladores de temas que no están "al tanto".
Llamemos a nuestra Plantilla de Página page-portfolio.php para coincidir con la convención de nomenclatura para las plantillas de tipo de publicación personalizadas aunque no sea una. Aquí está el código:
/ * Nombre de la plantilla: Cartera * / $ paged = 1; if (get_query_var ('paged')) $ paged = get_query_var ('paged'); if (get_query_var ('page')) $ paged = get_query_var ('page'); query_posts ('& post_type = portfolio & paged ='. $ paged); require_once ('archive-portfolio.php');
Esta es la primera vez que ves el archivo-posttype.php Plantilla encadenada a otra plantilla. ¡Y funciona! ¿Pero qué diablos está pasando? Este negocio de la variable janky $ paginado resalta el problema exacto que los desarrolladores parecen tener con la paginación de tipo de publicación personalizada. Básicamente, si esta solución (tos) no está en su lugar y un usuario hace clic para ver la página 2, como alguien que ha sido golpeado en la cabeza, WordPress se confunde y no sabe dónde está. Y, para agregar insultos a las lesiones, WordPress lo sabe y lo acepta como un procedimiento de desarrollo normal al publicar esta nota en la sección Parámetros de paginación de la página del Códice para WP_Query ():
Nota de paginación: Debes establecer get_query_var ('page'); Si quieres que tu consulta funcione con paginación. Desde WordPress 3.0.2, haces get_query_var ('page') en lugar de get_query_var ('paged'). El parámetro de paginación 'paginado' para WP_Query () sigue siendo el mismo.
Para mí, tiene sentido que los desarrolladores puedan configurar esa variable y apuntar a una página específica. Lo que no tiene sentido es por qué la paginación funciona de forma inherente con los tipos de publicación predeterminados (es decir, publicación, página, archivo adjunto), pero no con los personalizados.
Más allá de tener que parchear el código, hay otra captura aquí en la que no puedes llamar a tu barra de página la misma cosa que tu barra de tipo de publicación personalizada. Piense en su tipo de mensaje personalizado como una palabra clave reservada; sin embargo, puede hacer que el título de su página tenga el mismo nombre que su barra de tipo de publicación personalizada siempre y cuando su barra de página sea algo diferente..
Utilizando la front-page.php La plantilla bloquea a los usuarios en una página frontal personalizada sin la posibilidad de cambiarlos (a menos que eliminen el archivo o lo cambien temporalmente). Es por eso que la mayoría de los desarrolladores optan por el método de Plantilla de Página para crear Front Pages estáticas, pero por mi método, digamos que estamos usando el primero. Para lograr la paginación de tipo de publicación personalizada para esta plantilla, todo lo que tenemos que hacer es simplemente incluir lo que hemos hecho por archivo-posttype.php Me gusta esto:
require_once ('page-portfolio.php');
los taxonomy-posttype-taxonomy.php La plantilla funciona de la misma manera que la front-page.php plantilla, pero en lugar de incluir la page-portfolio.php plantilla, en su lugar incluirá nuestro índice, archivo-posttype.php, Me gusta esto:
require_once ('archive-posttype.php');
Eso completa el alcance de mi método. Donde una vez estaba golpeando mi cabeza contra el escritorio a las dos de la mañana, ahora me muevo tranquilamente a través de proyectos a las dos de la tarde. ¡Victoria! Bien, al menos por ahora. No soy tan ingenuo como para pensar que no me encuentre en una situación en la que este método no funcione para la paginación de tipo de publicación personalizada, pero aún no lo he hecho..
A diferencia de mis otros mensajes, espero que este se vuelva obsoleto. Mi esperanza es que WordPress actuará en la encuesta reciente que muestra que el 92% de todos los desarrolladores utilizan WordPress como CMS y analizan cómo funciona la paginación en su plataforma. El equipo de WordPress es nada menos que profesional. Imagino un futuro en el que haya herramientas de paginación integradas y posiblemente una página de administrador de tipo de publicación personalizada en Configuración para administrar publicaciones por página por tipo de publicación personalizada. Pero por ahora espero que este método de encadenamiento ayude a los muchos desarrolladores que he visto sufrir en los foros de WordPress. Siéntase libre de descargar, usar y abusar de los siguientes archivos comprimidos como un marco para una paginación de tipo de publicación personalizada exitosa. Disfrutar!