{"id":233876,"date":"2023-02-25T11:11:00","date_gmt":"2023-02-25T08:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233876"},"modified":"2022-11-11T12:56:13","modified_gmt":"2022-11-11T09:56:13","slug":"tutorial-de-tema-de-wordpress-para-principiantes-parte-12-consulta-de-publicacion-personalizada","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/tutorial-de-tema-de-wordpress-para-principiantes-parte-12-consulta-de-publicacion-personalizada\/","title":{"rendered":"Tutorial de tema de WordPress para principiantes \u2013 Parte 12: Consulta de publicaci\u00f3n personalizada"},"content":{"rendered":"\n<p>En esta lecci\u00f3n final, aprenderemos c\u00f3mo escribir su propia consulta de publicaciones y recorrerlas sin interrumpir el ciclo principal en la plantilla. Haremos una parte de plantilla para publicaciones individuales que muestre publicaciones relacionadas en la misma categor\u00eda.<\/p>\n<p>Lo que haremos en esta lecci\u00f3n es una consulta de publicaciones relacionadas en nuestra vista de publicaci\u00f3n \u00fanica, mostrando un m\u00e1ximo de 3 publicaciones, del tipo de publicaci\u00f3n, en la misma categor\u00eda o categor\u00edas que la publicaci\u00f3n en la que estamos, excluyendo la publicaci\u00f3n actual en s\u00ed, y aleatorizar las publicaciones que se muestran. Tambi\u00e9n veremos estrategias para no estropear el ciclo anidado.<\/p>\n<h2>Plantilla de publicaciones relacionadas<\/h2>\n<p>Hagamos que las publicaciones relacionadas sean una parte de la plantilla, que aprendimos en la <a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-10-fleshing-out-templates\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">parte 10<\/a>. De esa manera no complicamos demasiado <code>single.php<\/code>y hacemos que nuestro c\u00f3digo sea m\u00e1s reutilizable. Coloca el pedido de esta nueva pieza de plantilla donde desees. Lo colocar\u00e9 justo antes de solicitar la plantilla de comentarios:<\/p>\n<pre><code>...\n    &lt;\/article&gt;\n    &lt;?php \n    get_template_part('related-posts');\n    if (comments_open()) {\n        comments_template();\n    }\n    endwhile;\n...<\/code><\/pre>\n<p>Ahora, hagamos un nuevo archivo vac\u00edo en nuestra carpeta de temas y as\u00edgnele el nombre <code>related-posts.php<\/code>. Con este archivo, estamos listos para sumergirnos en la creaci\u00f3n de una consulta de publicaci\u00f3n personalizada.<\/p>\n<h2>Consulta de publicaci\u00f3n personalizada<\/h2>\n<p>Si quieres hacer una consulta personalizada de publicaciones, tienes algunas opciones, pero te recomiendo que te acostumbres a la clase <code>WP_Query<\/code>. Marque <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta p\u00e1gina de documentaci\u00f3n,<\/a> ya que la consultar\u00e1 con frecuencia, porque hay muchas opciones. Le mostrar\u00e9 un ejemplo pr\u00e1ctico de c\u00f3mo configurar una consulta haciendo referencia a la documentaci\u00f3n de cada especificaci\u00f3n que queremos agregar.<\/p>\n<p>Si desea obtener m\u00e1s informaci\u00f3n sobre c\u00f3mo consultar publicaciones, <a href=\"http:\/\/awhitepixel.com\/blog\/how-to-query-posts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tengo una publicaci\u00f3n<\/a> que profundiza sobre eso.<\/p>\n<p>Para hacer una consulta de publicaci\u00f3n personalizada, llamaremos <code>new WP_Query()<\/code>, le pasaremos una serie de argumentos y almacenaremos su resultado en una variable. Y luego usaremos exactamente el mismo bucle que hemos usado antes en nuestras plantillas (eche un <a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-4-accessing-posts-with-the-loop\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vistazo al bucle original aqu\u00ed<\/a> para comparar). Pero necesitamos decirle al bucle que pase por la variable, en lugar de la global (que es la publicaci\u00f3n \u00fanica).<\/p>\n<p>As\u00ed es como se ver\u00e1 el bucle al agregarlo a una consulta personalizada:<\/p>\n<pre><code>$related_posts = new WP_Query([\n    \/\/ Arguments here\n]);\nif ($related_posts-&gt;have_posts()) {\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        \/\/ Access to each post here\n    endwhile;\n    wp_reset_postdata();\n}<\/code><\/pre>\n<p>Como puede ver, el ciclo es exactamente el mismo, usando <code>have_posts<\/code>y <code>the_post<\/code>. La diferencia es que los llamamos sobre el <code>$related_posts<\/code>objeto. Si omitimos la <code>$related_posts<\/code>parte, WordPress asume autom\u00e1ticamente que es la consulta global de publicaciones.<\/p>\n<p>Tambi\u00e9n puede notar la llamada a la funci\u00f3n <code>wp_reset_postdata()<\/code>justo despu\u00e9s del bucle. As\u00ed es como &quot;limpiamos despu\u00e9s de nosotros mismos&quot; despu\u00e9s de una consulta personalizada con <code>WP_Query<\/code>. Recuerde que <code>the_post()<\/code>configura el objeto de publicaci\u00f3n global para que podamos usar <code>the_title()<\/code>etc. Y como ya estamos dentro de un bucle (el que est\u00e1 en <code>single.php<\/code>), debemos asegurarnos limpiamos y restablecemos la publicaci\u00f3n de nuevo a la publicaci\u00f3n \u00fanica despu\u00e9s de que hayamos terminado. Si no restablecemos los datos de la publicaci\u00f3n, cualquier cosa despu\u00e9s de esto se referir\u00e1 a la \u00faltima publicaci\u00f3n relacionada que revisamos. \u00a1Esto puede ser un gran problema! En nuestro ejemplo, tener una plantilla de comentarios que siga a esto. Omitir el restablecimiento har\u00e1 que la plantilla de comentarios muestre comentarios de la \u00faltima publicaci\u00f3n relacionada en el ciclo. \u00a1Y no la \u00fanica publicaci\u00f3n que estamos viendo en realidad!<\/p>\n<h3>Implementando nuestro bucle personalizado<\/h3>\n<p>Muy bien, comencemos a implementar el bucle personalizado en nuestro <code>related-posts.php<\/code>. Agregu\u00e9 un contenedor y un t\u00edtulo, pero como de costumbre, puede ajustar el HTML como desee:<\/p>\n<pre><code>&lt;div class=\"related-posts\"&gt;\n    &lt;h2&gt;&lt;?php _e('Related posts', 'wptutorial'); ?&gt;&lt;\/h2&gt;\n    &lt;?php\n    $related_posts = new WP_Query([\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n        while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n\u00a0\n        endwhile;\n        wp_reset_postdata();\n    }\n    ?&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Ahora veremos el poder de la reutilizaci\u00f3n en las piezas de plantilla. Digamos que dentro de este bucle personalizado queremos mostrar exactamente el mismo contenido que mostramos en nuestro <code>content-loop.php<\/code>, que usamos en nuestras plantillas de archivo. Todo lo que tenemos que hacer es solicitar esta parte de la plantilla dentro de nuestro ciclo personalizado, \u00a1ya estamos listos para manejar el resultado de cada publicaci\u00f3n!<\/p>\n<pre><code>...\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        get_template_part('content-loop');\n    endwhile;\n...<\/code><\/pre>\n<p>Ahora todo lo que queda es agregar los argumentos a nuestra consulta posterior, asegur\u00e1ndonos de obtener lo que queremos. Repasemos los argumentos uno por uno.<\/p>\n<h2>Construyendo los argumentos para nuestra consulta de publicaci\u00f3n personalizada<\/h2>\n<p>No queremos obtener m\u00e1s publicaciones que 3. En la documentaci\u00f3n (secci\u00f3n &quot;Par\u00e1metros de paginaci\u00f3n&quot;), el argumento para esto es <code>posts_per_page<\/code>. As\u00ed que agregamos el elemento de matriz:<\/p>\n<pre><code>'posts_per_page' =&gt; 3<\/code><\/pre>\n<p>Queremos asegurarnos de que WordPress obtenga publicaciones y no p\u00e1ginas u otra cosa. En \u00abPar\u00e1metros de tipo de publicaci\u00f3n&quot; encontramos:<\/p>\n<pre><code>'post_type' =&gt; 'post'<\/code><\/pre>\n<p>Queremos evitar que la \u00fanica publicaci\u00f3n en la que estamos aparezca en nuestra consulta de publicaciones relacionadas, porque eso no tiene sentido, \u00bfverdad? La documentaci\u00f3n nos dice en &quot;Par\u00e1metros de publicaci\u00f3n y p\u00e1gina&quot; que podemos agregar la ID de la publicaci\u00f3n en una matriz para <code>post__not_in<\/code>:<\/p>\n<pre><code>'post__not_in' =&gt; [get_the_ID()]<\/code><\/pre>\n<p>Tambi\u00e9n queremos aleatorizar las publicaciones; porque, de forma predeterminada, obtendr\u00e1 las \u00faltimas publicaciones publicadas y eso puede volverse bastante repetitivo r\u00e1pidamente a medida que avanza en las publicaciones. Afortunadamente, WordPress tiene una funci\u00f3n para esto en la forma en que ordena las publicaciones; en \u00abOrdenar y ordenar por par\u00e1metros\u00bb encontramos:<\/p>\n<pre><code>'orderby' =&gt; 'rand'<\/code><\/pre>\n<p>Finalmente, queremos consultar las publicaciones que est\u00e1n dentro de las mismas categor\u00edas que la publicaci\u00f3n en la que nos encontramos. Para hacer esto, primero debemos, antes de los argumentos de la consulta, llevar las categor\u00edas a la \u00fanica publicaci\u00f3n en la que nos encontramos. En &quot;Par\u00e1metros de categor\u00eda&quot; vemos que podemos proporcionar una matriz de ID de categor\u00eda a <code>category__in<\/code>. Afortunadamente, WordPress tiene una funci\u00f3n para obtener ID de categor\u00eda para una publicaci\u00f3n; <code>wp_get_post_categories()<\/code>que podemos usar directamente como valor para el par\u00e1metro. \u00a1Perfecto!<\/p>\n<p>Aqu\u00ed est\u00e1 la consulta final y sus argumentos:<\/p>\n<pre><code>...\n&lt;?php\n    $post_cats = wp_get_post_categories(get_the_ID());\n    $related_posts = new WP_Query([\n        'post_type' =&gt; 'post',\n        'posts_per_page' =&gt; 3,\n        'category__in' =&gt; $post_cats,\n        'post__not_in' =&gt; [get_the_ID()],\n        'orderby' =&gt; 'rand'\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n...<\/code><\/pre>\n<p>Actualice y deber\u00eda ver 3 publicaciones en la parte inferior de la vista \u00fanica. Actualice varias veces para ver que cambian porque le dijimos a WordPress que los aleatorizara. Nota: si tiene menos de 3 publicaciones en la misma categor\u00eda, obtendr\u00e1 menos de 3 publicaciones.<\/p>\n<p>\u00a1Eso es todo! Ahora ya sabe c\u00f3mo consultar las publicaciones que desee. La <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina de documentaci\u00f3n de WP_Query<\/a> es extremadamente \u00fatil para ajustar su consulta, porque aqu\u00ed hay posibilidades realmente ilimitadas. Te animo a que juegues con los par\u00e1metros y tal vez intentes crear una parte de plantilla separada para usar en publicaciones relacionadas.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta lecci\u00f3n de tema de WordPress, aprender\u00e1 c\u00f3mo escribir su propia consulta de publicaciones y recorrerlas sin interrumpir el ciclo principal en la plantilla.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[924,892,892,716,716,831,914,1110,914,831,924,840,840,861,861],"tags":[1172],"class_list":["post-233876","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asignaturas","category-codigo","category-desarrollador","category-guia-para-principiantes","category-otro","category-n-a","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233876","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=233876"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233876\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}