{"id":230886,"date":"2022-12-16T10:41:00","date_gmt":"2022-12-16T07:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230886"},"modified":"2022-12-07T11:40:11","modified_gmt":"2022-12-07T08:40:11","slug":"paginacion-de-wordpress-una-utilidad-simple-y-por-que","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/paginacion-de-wordpress-una-utilidad-simple-y-por-que\/","title":{"rendered":"Paginaci\u00f3n de WordPress: una utilidad simple (y por qu\u00e9)"},"content":{"rendered":"\n<p>Al crear plantillas para WordPress, generalmente tiene funciones de paginaci\u00f3n que provienen de la propia aplicaci\u00f3n.<\/p>\n<p>Estos incluyen cosas como:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_post()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_post_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_post_link()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">obtener_publicaci\u00f3n_anterior()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_post_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_anterior_post_link()<\/a><\/li>\n<\/ul>\n<p>Y hay algunas otras publicaciones que le brindan una mayor granularidad en torno a taxonom\u00edas como <strong><a href=\"https:\/\/tommcfarlin.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_adjacent_post()<\/a><\/strong>.<\/p>\n<p>Recomiendo leer todos los enlaces anteriores porque son \u00fatiles si est\u00e1 creando un tema, trabajando con tipos de publicaciones personalizadas o simplemente buscando una comprensi\u00f3n m\u00e1s profunda de algunas de las etiquetas de plantilla comunes.<\/p>\n<p>Sin embargo, si est\u00e1 buscando una manera f\u00e1cil de escribir su utilidad de paginaci\u00f3n de WordPress (cuya raz\u00f3n explicar\u00e9 moment\u00e1neamente), entonces el resto de esta publicaci\u00f3n cubrir\u00e1 exactamente eso.<\/p>\n<h2>Paginaci\u00f3n personalizada de WordPress<\/h2>\n<p>En primer lugar, siempre que est\u00e9 creando una aplicaci\u00f3n web para alguien, es probable que haya matices en los que la funcionalidad nativa de WordPress puede no funcionar. Tal vez no funcione como se esperaba, no funcione seg\u00fan lo previsto o no satisfaga sus necesidades.<\/p>\n<p>Cualquiera que sea el caso, eso no significa que la paginaci\u00f3n no pueda construirse para servir a sus prop\u00f3sitos. Despu\u00e9s de todo, el n\u00facleo de la paginaci\u00f3n, especialmente en lo que se refiere a la paginaci\u00f3n de una sola publicaci\u00f3n, es b\u00e1sicamente esto:<\/p>\n<p>Desde la publicaci\u00f3n actual, vea si existe una publicaci\u00f3n anterior y vea si existe una publicaci\u00f3n posterior. Si existe alg\u00fan tipo de publicaci\u00f3n, proporcione un enlace a la misma; de lo contrario, no lo hagas.<\/p>\n<p>A partir de aqu\u00ed, podemos determinar que necesitaremos las siguientes caracter\u00edsticas:<\/p>\n<ol>\n<li>una forma de determinar si existe una publicaci\u00f3n detr\u00e1s de la publicaci\u00f3n actual,<\/li>\n<li>una forma de determinar si existe una publicaci\u00f3n despu\u00e9s de la publicaci\u00f3n actual,<\/li>\n<li>una forma de recuperar una publicaci\u00f3n dada,<\/li>\n<li>una forma de obtener el enlace permanente para la publicaci\u00f3n dada.<\/li>\n<\/ol>\n<p>Sin embargo, trabajo para ser muy particular en el lenguaje anterior, porque una publicaci\u00f3n que est\u00e1 &quot;detr\u00e1s&quot; o &quot;despu\u00e9s&quot; de una publicaci\u00f3n determinada puede no tener una identificaci\u00f3n que sea uno menos que la identificaci\u00f3n de la publicaci\u00f3n actual.<\/p>\n<p>Es simplemente la primera publicaci\u00f3n que se publica y se puede recuperar en cualquier direcci\u00f3n, \u00bfverdad?<\/p>\n<p>Entonces, con eso en mente, esto significa que necesitaremos dos consultas:<\/p>\n<ul>\n<li>una consulta para recuperar la publicaci\u00f3n detr\u00e1s de la publicaci\u00f3n actual,<\/li>\n<li>una consulta para recuperar la publicaci\u00f3n despu\u00e9s de la publicaci\u00f3n actual.<\/li>\n<\/ul>\n<p>Para este ejemplo, asumo que tienes acceso al ID de la publicaci\u00f3n actual a trav\u00e9s de la funci\u00f3n <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_the_id\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_the_ID()<\/a><\/strong>.<\/p>\n<h3>Obtener una publicaci\u00f3n detr\u00e1s de la publicaci\u00f3n actual<\/h3>\n<p>Para hacer esto, necesitamos crear una consulta simple que tome una publicaci\u00f3n publicada de la base de datos del tipo de publicaci\u00f3n especificado, y que est\u00e9 relacionada con la posici\u00f3n de la publicaci\u00f3n actual.<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-00-previous-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Podemos hacer esto<\/a><\/strong> limitando el conjunto de resultados a uno, ordenando los resultados en orden descendente y comparando el valor de la ID de la publicaci\u00f3n:<\/p>\n<pre><code>&lt;?php\n\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT *\n        FROM $wpdb-&gt;posts\n        WHERE ID &lt; (SELECT ID\n            FROM $wpdb-&gt;posts\n            WHERE ID = %d\n            AND post_type = '%s'\n            AND post_status = '%s'\n            ORDER BY ID DESC) AND post_type = '%s'\n        AND post_status = '%s'\n        ORDER BY ID DESC\n        LIMIT 1\n        \",\n        get_the_ID(),\n        'acme-custom-post-type',\n        'publish',\n        'acme-custom-post-type',\n        'publish') );<\/code><\/pre>\n<p>Esto devolver\u00e1 una serie de resultados que veremos c\u00f3mo administrar en un momento.<\/p>\n<h3>Obtener la publicaci\u00f3n despu\u00e9s de la publicaci\u00f3n actual<\/h3>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-01-next-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Para la pr\u00f3xima publicaci\u00f3n<\/a><\/strong>, escribimos una consulta similar. Pero en su lugar, buscamos el siguiente valor que es m\u00e1s grande y que est\u00e1 por delante de la ID actual:<\/p>\n<pre><code>&lt;?php\n\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT *\n        FROM $wpdb-&gt;posts\n        WHERE ID &gt; (SELECT ID\n            FROM $wpdb-&gt;posts\n            WHERE ID = %d\n            AND post_type = '%s'\n            AND post_status = '%s'\n            ORDER BY ID ASC) AND post_type = '%s'\n        AND post_status = '%s'\n        ORDER BY ID ASC\n        LIMIT 1\n        \",\n        get_the_ID(),\n        'acme-custom-post-type',\n        'publish',\n        'acme-custom-post-type',\n        'publish') );<\/code><\/pre>\n<p>Ahora necesitamos algunas funciones para determinar si existen publicaciones. Podemos hacer esto con la matriz de resultados que se devuelve.<\/p>\n<h3>Comprobar si existe una publicaci\u00f3n<\/h3>\n<p>Tenga en cuenta que <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-03-has-previous-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en el siguiente ejemplo<\/a><\/strong>, la funci\u00f3n acepta la matriz de resultados y simplemente regresa si hay una publicaci\u00f3n anterior. Los resultados que se pasan a esta funci\u00f3n deben ser de la consulta anterior anterior.<\/p>\n<p>En segundo lugar, tenga en cuenta que es privado. Es posible que desee hacer p\u00fablico el suyo seg\u00fan c\u00f3mo desee construir sus plantillas.<\/p>\n<pre><code>&lt;?php \n\/**\n * @param array $results the results of the query to determined if there are past posts\n *\n * @return bool true if there is a previous post; otherwise, false\n *\/\nprivate function hasPreviousPost($results)\n{\n    return isset($results[0]);\n}<\/code><\/pre>\n<p>Y luego, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-04-has-next-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">para la pr\u00f3xima publicaci\u00f3n,<\/a><\/strong> se ve igual, pero recuerde que los resultados que se pasan a esta funci\u00f3n provienen de una consulta diferente.<\/p>\n<pre><code>&lt;?php\n\/**\n * @param array $results the results of the query to determined if there are future posts\n *\n * @return bool true if there is a next post; otherwise, false\n *\/\nprivate function hasNextPost($results)\n{\n    return isset($results[0]);\n}<\/code><\/pre>\n<p>Y finalmente, podemos usar estas funciones condicionales para obtener el enlace permanente.<\/p>\n<h3>Obtener el enlace<\/h3>\n<p>Recuerde, la forma en que usa esta funci\u00f3n puede variar de la implementaci\u00f3n que he proporcionado. Entonces, si no necesita que sea privado, cambie su visibilidad y util\u00edcelo en su plantilla seg\u00fan <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-05-get-post-link-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sea necesario<\/a><\/strong>.<\/p>\n<pre><code>&lt;?php\n\/**\n * @param array $results the results of the array from which to retrieve the post ID\n *\n * @return string the ID of the post to which we're going to link\n *\/\nprivate function getPostLink($results)\n{\n    return get_the_permalink($results[0]-&gt;ID);\n}<\/code><\/pre>\n<p>Finalmente, tenga en cuenta que esta funci\u00f3n acepta los resultados que le pasa desde cualquier consulta y recuperar\u00e1 la propiedad ID del primer \u00edndice de los resultados.<\/p>\n<p>Esto se debe a que los resultados se limitan a uno y se basan en su uso de las funciones condicionales. Es decir, puedes hacer algo como:<\/p>\n<ul>\n<li>si hay una pr\u00f3xima publicaci\u00f3n, obtenga el enlace de la pr\u00f3xima publicaci\u00f3n<\/li>\n<\/ul>\n<p>Pero su implementaci\u00f3n puede variar.<\/p>\n<h2>\u00bfPor qu\u00e9 es esto necesario?<\/h2>\n<p>Puede que no sea necesario. Eso es todo: si est\u00e1 utilizando WordPress listo para usar con muy poca personalizaci\u00f3n o extensi\u00f3n y no necesita hacer nada m\u00e1s all\u00e1 de lo que puede proporcionar, es posible que no necesite esto.<\/p>\n<p>Si, por otro lado, est\u00e1 buscando una forma de introducir la funcionalidad de paginaci\u00f3n de WordPress en una sola publicaci\u00f3n, entonces esta es una forma de hacerlo que puede manejar adecuadamente el caso de publicaciones que son de un tipo de publicaci\u00f3n espec\u00edfico pero no t tiene identificaciones secuenciales (y que funcionan solo con un estado de publicaci\u00f3n).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Al crear una aplicaci\u00f3n web, es probable que haya matices en los que la funcionalidad nativa puede no funcionar. Es posible que necesite una paginaci\u00f3n personalizada de WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236123,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,800,861],"tags":[1172],"class_list":["post-230886","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-php-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230886","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230886"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230886\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230886"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230886"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}