{"id":233845,"date":"2023-02-24T11:20:00","date_gmt":"2023-02-24T08:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233845"},"modified":"2022-11-11T12:46:11","modified_gmt":"2022-11-11T09:46:11","slug":"guia-como-consultar-publicaciones-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/guia-como-consultar-publicaciones-en-wordpress\/","title":{"rendered":"Gu\u00eda: C\u00f3mo consultar publicaciones en WordPress"},"content":{"rendered":"\n<p>\u00bfQu\u00e9 m\u00e9todos est\u00e1n disponibles para hacer una consulta de publicaci\u00f3n personalizada y cu\u00e1ndo es mejor usarlos? Esta publicaci\u00f3n tiene como objetivo establecer una comprensi\u00f3n s\u00f3lida de dos m\u00e9todos de consulta de publicaciones, c\u00f3mo acceder a los resultados, c\u00f3mo construir argumentos y, finalmente, c\u00f3mo limpiar despu\u00e9s de eso. Los dos m\u00e9todos que veremos son <code>get_posts()<\/code>y <code>WP_Query<\/code>.<\/p>\n<p>Cuando se trata de hacer una nueva consulta de publicaci\u00f3n, en realidad hay dos opciones (en el momento de escribir este art\u00edculo). La elecci\u00f3n realmente solo depende de su preferencia (y alg\u00fan efecto de rendimiento menor). Una opci\u00f3n tiene el potencial de estropear el bucle\/consulta global en el que se encuentra actualmente, a menos que lo maneje correctamente. Con una opci\u00f3n maneja objetos y en la otra opci\u00f3n maneja una matriz. Sin embargo, los argumentos para personalizar la consulta posterior son id\u00e9nticos.<\/p>\n<h2>\u00bfConsulta global?<\/h2>\n<p>Si no est\u00e1 seguro de lo que quiero decir con &quot;estropear la consulta global&quot;, es esto. WordPress siempre realiza una consulta global, dependiendo de la p\u00e1gina en la que se encuentre. Si un visitante visita un archivo de categor\u00eda, WordPress ha realizado una consulta de publicaci\u00f3n para esto. El tema normalmente acceder\u00eda a las publicaciones en la consulta usando &quot;el bucle&quot;. Cuando hacemos una nueva consulta con su propio bucle dentro de este bucle, debemos asegurarnos de que la consulta global de WordPress y nuestra consulta se manejen por separado.<\/p>\n<p>Sin embargo, si desea modificar la consulta de publicaci\u00f3n de WordPress, esa es otra historia. Tengo <a href=\"http:\/\/awhitepixel.com\/blog\/modifying-wordpress-global-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">otra publicaci\u00f3n<\/a> que profundiza sobre c\u00f3mo hacer eso.<\/p>\n<p>Veamos las dos opciones que tenemos y c\u00f3mo las manejamos. Despu\u00e9s de eso, veremos los argumentos para personalizar la consulta. Tenga en cuenta que los argumentos son id\u00e9nticos para ambos.<\/p>\n<h2><strong>Los dos m\u00e9todos de consulta de publicaciones.<\/strong><\/h2>\n<p>Puede consultar publicaciones con la funci\u00f3n <code>get_posts()<\/code>o creando una nueva instancia de <code>WP_Query.<\/code>La primera opci\u00f3n devuelve una matriz de publicaciones y en la segunda maneja un objeto. Debido a que <code>get_posts()<\/code>devuelve una matriz de solo las publicaciones, generalmente es m\u00e1s simple usar esto en cualquier lugar que desee. Sin embargo, si desea paginar su consulta, definitivamente debe crear una <code>WP_Query<\/code>instancia.<\/p>\n<p>La funci\u00f3n <code>get_posts<\/code>es una funci\u00f3n contenedora, <code>WP_Query<\/code>lo que significa que acepta los mismos argumentos, pero <code>get_posts<\/code>tiene algunos argumentos de &quot;alias&quot; adicionales. La p\u00e1gina de documentaci\u00f3n de WordPress para <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_posts\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_posts<\/a> no enumera los posibles argumentos (excepto los argumentos de alias), pero se refiere a la p\u00e1gina de documentaci\u00f3n de <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a> para los argumentos. Veremos m\u00e1s de cerca los argumentos m\u00e1s adelante.<\/p>\n<p>Si el rendimiento es un problema (es decir, el sitio tiene muchas publicaciones), <code>get_posts<\/code>es m\u00e1s r\u00e1pido que usar <code>WP_Query<\/code>porque omite el c\u00e1lculo de la paginaci\u00f3n.<\/p>\n<p>El m\u00e9todo de recorrer su consulta de publicaci\u00f3n personalizada difiere seg\u00fan el m\u00e9todo que elija. Debe estar familiarizado con el bucle com\u00fan de WordPress que se usa en casi todas las plantillas de temas:<\/p>\n<pre><code>if (have_posts()) {\n    while (have_posts()): the_post();\n        \/\/ Access to each post; you can use template tags here\n    endwhile;\n}<\/code><\/pre>\n<h3><strong>Bucle usando WP_Query<\/strong><\/h3>\n<p>Repetir los resultados de using <code>WP_Query<\/code>es exactamente lo mismo, excepto que nos referimos espec\u00edficamente al objeto de instancia en el bucle. Tambi\u00e9n debemos recordar &quot;restablecer el estado&quot; despu\u00e9s de que terminemos de hacer un bucle para que el objeto de publicaci\u00f3n global vuelva a ser como era antes. Para hacer eso usamos <code>wp_reset_postdata()<\/code>.<\/p>\n<pre><code>$custom_query = new WP_Query([\/ Arguments here \/]);\nif ($custom_query-&gt;have_posts()) {\n    while ($custom_query-&gt;have_posts()): $custom_query-&gt;the_post();\n        \/\/ Access to each post; you can use template tags here\n    endwhile;\n    wp_reset_postdata();\n}<\/code><\/pre>\n<p>Si descarga el objeto instanciado por <code>WP_Query<\/code>( <code>$custom_query<\/code>en el ejemplo anterior), encontrar\u00e1 la consulta completa y los argumentos utilizados. Las partes interesantes aqu\u00ed son las propiedades &#8216; <code>found_posts<\/code>&#8216; y &#8216; <code>posts<\/code>&#8216;. La <code>posts<\/code>propiedad &#8216; &#8216; contiene el resultado de los objetos de publicaci\u00f3n por los que se ejecutar\u00e1 el ciclo. El n\u00famero de publicaciones que coincidieron con su consulta se devuelve en &#8216; <code>found_posts<\/code>&#8216; y es \u00fatil si desea realizar una paginaci\u00f3n personalizada. Divida este valor con la configuraci\u00f3n de WordPress para el n\u00famero de publicaciones por p\u00e1gina para averiguar cu\u00e1ntas p\u00e1ginas necesita para su consulta, o simplemente consulte la propiedad &#8216; <code>max_num_pages<\/code>&#8216;.<\/p>\n<p>Nota: cuando usa <code>get_posts<\/code>WordPress, solo devuelve la <code>posts<\/code>propiedad &#8216; &#8216; (que es una matriz) del <code>WP_Query<\/code>objeto.<\/p>\n<h3><strong>Bucle usando get_posts<\/strong><\/h3>\n<p>Al usar <code>get_posts<\/code>no usamos el &quot;bucle de WordPress&quot; habitual, sino que usamos un bucle de matriz de PHP normal. Cada elemento de la matriz son objetos de publicaci\u00f3n, y no es necesario restablecerlos una vez que haya terminado de realizar el bucle. Tenga en cuenta que las etiquetas de plantilla (como <code>the_title()<\/code>, <code>the_permalink()<\/code>etc.) no est\u00e1n disponibles dentro de este bucle. Deber\u00e1 consultar las propiedades del objeto de la publicaci\u00f3n (p. ej <code>$custom_post-&gt;ID<\/code>., ).<\/p>\n<pre><code>$custom_query = get_posts([\/ Arguments here \/]);\nforeach ($custom_query as $custom_post) {\n    \/\/ Template tags are not available here, refer to the post object properties, for example:\n    echo $custom_post-&gt;post_title;\n}<\/code><\/pre>\n<p>Recomiendo que nombre sus objetos de publicaci\u00f3n algo diferente a <code>$post<\/code>. Es posible que encuentre problemas al intentar acceder a las propiedades de la publicaci\u00f3n (es posible que se refiera al objeto de la publicaci\u00f3n global y no a la publicaci\u00f3n en el bucle).<\/p>\n<p>Si desea utilizar <a href=\"https:\/\/codex.wordpress.org\/Template_tags#Post_tags\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">etiquetas de plantilla<\/a> para acceder m\u00e1s f\u00e1cilmente a la informaci\u00f3n de la publicaci\u00f3n (como <code>the_title()<\/code>y <code>the_permalink()<\/code>), puede hacerlo. Haga esto dici\u00e9ndole a WordPress que configure el objeto de publicaci\u00f3n global dentro del ciclo con <code>setup_postdata()<\/code>. Si hace esto, deber\u00e1 restablecer el estado <code>wp_reset_postdata()<\/code>despu\u00e9s del bucle.<\/p>\n<pre><code>$custom_query = get_posts([\/ Arguments here \/]);\nforeach ($custom_query as $post) {\n    setup_postdata($post);\n    \/\/ Template tags are available here, for example:\n    the_title();\n}\nwp_reset_postdata();<\/code><\/pre>\n<p>\u00a1 Tenga en cuenta que <code>setup_postdata<\/code>requiere que se nombren los objetos que est\u00e1 recorriendo (la <code>as<\/code>parte \u00bb &quot; en el ciclo foreach) <code>$post<\/code>! En el primer ejemplo, nombr\u00e9 los objetos de publicaci\u00f3n <code>$custom_post<\/code>y esto no funcionar\u00eda con <code>setup_postdata()<\/code>.<\/p>\n<p>Sin embargo, si solo necesita acceder a la informaci\u00f3n b\u00e1sica de la publicaci\u00f3n, tambi\u00e9n puede omitir la configuraci\u00f3n del objeto de publicaci\u00f3n global y, en su lugar, usar las <code>get_<\/code>etiquetas de plantilla &quot; &quot; correspondientes y la identificaci\u00f3n de la publicaci\u00f3n. Por ejemplo, la etiqueta <code>the_permalink()<\/code>solo funciona correctamente si el objeto de publicaci\u00f3n global est\u00e1 configurado, pero puede solicitar el enlace permanente de la publicaci\u00f3n sin el objeto de publicaci\u00f3n global simplemente usando <code>echo get_the_permalink($custom_post-&gt;ID)<\/code>.<\/p>\n<h2><strong>Argumentos de consulta<\/strong><\/h2>\n<p>Puede encontrar la lista completa de todos los argumentos posibles en <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la p\u00e1gina de documentaci\u00f3n de WP_Query<\/a>. Ejemplos de par\u00e1metros son publicaciones con t\u00e9rminos espec\u00edficos de una taxonom\u00eda, metavalores de publicaciones, tipos de publicaciones, inclusi\u00f3n o exclusi\u00f3n de publicaciones espec\u00edficas y toda una gama de opciones para ordenar los resultados. Hay demasiados para analizar cada uno en detalle, pero aqu\u00ed hay algunos ejemplos comunes de argumentos para consultar publicaciones.<\/p>\n<h3>Ejemplo 1: publicaciones relacionadas de la misma categor\u00eda<\/h3>\n<p>Supongamos que desea mostrar &quot;publicaciones relacionadas&quot; al final de una sola publicaci\u00f3n. Deber\u00eda mostrar una selecci\u00f3n aleatoria de 3 publicaciones que est\u00e9n en la misma categor\u00eda que la publicaci\u00f3n actual, y deber\u00eda excluir la publicaci\u00f3n actual del resultado.<\/p>\n<pre><code>$post_id = get_the_ID();  \/\/ current post ID\n$custom_query = new WP_Query([\n    'post_type' =&gt; 'post',\n    'posts_per_page' =&gt; 3,\n    'category__in' =&gt; wp_get_post_categories($post_id),\n    'post__not_in' =&gt; [$post_id],\n    'orderby' =&gt; 'rand'\n]);<\/code><\/pre>\n<p>Los argumentos son bastante autoexplicativos. Pido solo &#8216; <code>post<\/code>&#8216; en &#8216; <code>post_type<\/code>y un m\u00e1ximo de 3 publicaciones en &#8216; <code>posts_per_page'<\/code>.<\/p>\n<p>Para consultar publicaciones en categor\u00edas, puede crear un <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#taxonomy-parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tax_query<\/a> o usar el &#8216; <code>category__in<\/code>&#8216; m\u00e1s simple (NB: solo funciona para la categor\u00eda de publicaci\u00f3n). En el ejemplo anterior, utilizo <code>wp_get_post_categories()<\/code>para obtener una serie de ID de t\u00e9rminos asignados a la publicaci\u00f3n proporcionada, y uso esto para el argumento &#8216; <code>category__in<\/code>&#8216;.<\/p>\n<p>Puede excluir ID de publicaci\u00f3n con &#8216; <code>post__not_in<\/code>&#8216; mientras que proporcion\u00e9 la ID de publicaci\u00f3n actual. Finalmente, ped\u00ed un orden aleatorio de publicaciones configurando &#8216; <code>rand<\/code>&#8216; en &#8216; <code>orderby<\/code>&#8216;. Puede proporcionar, por ejemplo, &#8216; <code>title<\/code>&#8216; o &#8216; <code>date<\/code>&#8216; para ordenarlos de manera diferente. Eche un vistazo a la <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/#order-orderby-parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentaci\u00f3n para realizar pedidos<\/a> para ver qu\u00e9 es posible.<\/p>\n<h3>Ejemplo 2: todas las publicaciones de un tipo de publicaci\u00f3n personalizado con m\u00faltiples argumentos de orden<\/h3>\n<p>En este ejemplo, asumimos que tiene un tipo de publicaci\u00f3n personalizada &#8216; <code>book<\/code>&#8216; y en una plantilla de p\u00e1gina personalizada desea mostrar todos los libros publicados. Desea ordenar las publicaciones principalmente por menu_order (el atributo de la p\u00e1gina, es un n\u00famero que puede establecer por publicaci\u00f3n) y, en segundo lugar, el t\u00edtulo de la publicaci\u00f3n.<\/p>\n<pre><code>$custom_query = new WP_Query([\n    'post_type' =&gt; 'book',\n    'posts_per_page' =&gt; -1,\n    'orderby' =&gt; ['meny_order' =&gt; 'ASC', 'title' =&gt; 'DESC']\n]);<\/code><\/pre>\n<p>Una vez m\u00e1s, los argumentos se explican por s\u00ed mismos. Solicito el tipo de publicaci\u00f3n &#8216; <code>book<\/code>&#8216; como &#8216; <code>post_type<\/code>&#8216;. Cuando establece &#8216; <code>posts_per_page<\/code>&#8216; a -1, obtendr\u00e1 todas las publicaciones (publicadas, a menos que especifique algo diferente en <code>post_status<\/code>el argumento \u00bb). Finalmente, proporciono una matriz a &#8216; <code>orderby<\/code>&#8216; para decirle a WordPress que ordene las publicaciones principalmente por orden de men\u00fa en orden ascendente y, en segundo lugar, el t\u00edtulo de la publicaci\u00f3n en orden descendente.<\/p>\n<h3>Ejemplo 3: Publicaciones con metadatos personalizados<\/h3>\n<p>Supongamos que tiene un tipo de publicaci\u00f3n personalizada &#8216; <code>book<\/code>&#8216; y desea consultar todos los libros que no est\u00e1n publicados o un libro publicado entre el a\u00f1o 1990 y 2019.<\/p>\n<pre><code>$custom_query = new WP_Query([\n    'post_type' =&gt; 'book',\n    'posts_per_page' =&gt; -1,\n    'meta_query' =&gt; [\n        'relation' =&gt; 'OR',\n        [\n            'key' =&gt; 'book_status',\n            'value' =&gt; 'unpublished',\n            'compare' =&gt; '='\n        ],\n        [\n            'key' =&gt; 'year_published',\n            'value' =&gt; [1990, 2019],\n            'type' =&gt; 'numeric',\n            'compare' =&gt; 'BETWEEN'\n        ]\n    ]\n]);<\/code><\/pre>\n<p>Es mejor crear una consulta mediante el uso de post meta <code>meta_query<\/code>(para argumentos meta muy simples que puede usar <code>meta_key<\/code>y <code>meta_value<\/code>directamente). El <code>meta_query<\/code>argumento &#8216; &#8216; requiere una matriz, donde cada argumento es una matriz. Puede controlar la relaci\u00f3n entre cada argumento con &#8216; <code>relation<\/code>&#8216;, que configur\u00e9 en &#8216; <code>OR<\/code>&#8216; en el ejemplo anterior.<\/p>\n<p>Proporciono dos argumentos de metadatos para &#8216; <code>meta_query<\/code>&#8216;. El primero simplemente compara la clave meta &#8216; <code>book_status<\/code>&#8216; con el texto &#8216; <code>unpublished<\/code>&#8216;, y si es igual, se incluir\u00e1. En el segundo argumento, le digo a WordPress que obtenga cualquier valor en la clave meta &#8216; <code>year_published<\/code>&#8216; que est\u00e9 entre los n\u00fameros 1990 y 2019.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Ahora deber\u00eda tener una comprensi\u00f3n b\u00e1sica de los dos m\u00e9todos para consultar publicaciones. No hay una gran diferencia ya que puede crear la misma consulta usando ambos, pero la forma de manejar los dos es diferente. Los tres ejemplos proporcionados de argumentos de consulta solo tocan la superficie de las consultas que puede crear. Consulte la <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentaci\u00f3n de WP_Query<\/a> para obtener una descripci\u00f3n general completa con muchos ejemplos.<\/p>\n<p>Si tiene curiosidad acerca de c\u00f3mo modificar la consulta global que realiza WordPress, tengo una <a href=\"http:\/\/awhitepixel.com\/blog\/modifying-wordpress-global-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">publicaci\u00f3n separada<\/a> que profundiza al respecto.<\/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 gu\u00eda, veremos dos m\u00e9todos para consultar publicaciones en WordPress (get_posts y WP_Query), c\u00f3mo acceder a cada publicaci\u00f3n y generar argumentos.<\/p>\n","protected":false},"author":1,"featured_media":224094,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[924,892,892,716,716,914,1110,914,800,800,924,840,840,861,861],"tags":[1172],"class_list":["post-233845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asignaturas","category-codigo","category-desarrollador","category-otro","category-n-a","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233845","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=233845"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233845\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/224094"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}