{"id":233946,"date":"2023-02-27T14:58:00","date_gmt":"2023-02-27T11:58:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233946"},"modified":"2022-11-11T13:20:21","modified_gmt":"2022-11-11T10:20:21","slug":"como-crear-una-plantilla-de-busqueda-avanzada-personalizada-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-crear-una-plantilla-de-busqueda-avanzada-personalizada-en-wordpress\/","title":{"rendered":"C\u00f3mo crear una plantilla de b\u00fasqueda avanzada personalizada en WordPress"},"content":{"rendered":"\n<p>Esta gu\u00eda es para usted que tiene un tipo de publicaci\u00f3n personalizada (CPT) y desea una p\u00e1gina de b\u00fasqueda avanzada que busque resultados dentro de este CPT. En el formulario de b\u00fasqueda puede configurar diferentes entradas para buscar dentro de diferentes campos; t\u00edtulo de la publicaci\u00f3n, contenido de la publicaci\u00f3n, cualquier tipo de meta personalizado o por taxonom\u00eda personalizada.<\/p>\n<p>En esta publicaci\u00f3n, supondremos que tenemos un tipo de publicaci\u00f3n personalizada para libros, una taxonom\u00eda personalizada adjunta para el g\u00e9nero de libros y un mont\u00f3n de metadatos personalizados; autor, a\u00f1o de publicaci\u00f3n, n\u00famero de ISBN y una casilla de verificaci\u00f3n si el libro est\u00e1 o no en stock. El tipo de publicaci\u00f3n personalizada y los par\u00e1metros dependen completamente de usted para adaptarse a sus necesidades, el c\u00f3digo a continuaci\u00f3n simplemente intentar\u00e1 cubrir la mayor\u00eda de las bases.<\/p>\n<h2>que haremos<\/h2>\n<p>Crearemos un tipo de publicaci\u00f3n personalizada para libros y una taxonom\u00eda jer\u00e1rquica personalizada adjunta para el g\u00e9nero. Adem\u00e1s, cada libro tiene campos personalizados para autor(es), a\u00f1o de publicaci\u00f3n, n\u00famero de ISBN y una casilla de verificaci\u00f3n para incluir o no libros que est\u00e1n agotados. En cuanto a la p\u00e1gina de b\u00fasqueda en s\u00ed, crearemos una plantilla de p\u00e1gina donde residir\u00e1 la mayor parte de nuestro c\u00f3digo. La p\u00e1gina comenzar\u00e1 mostrando un formulario personalizado al principio; mostrando todos los par\u00e1metros posibles para filtrar los resultados. Debajo de \u00e9l, todos los resultados de los libros aparecer\u00e1n en una lista. Decidimos un n\u00famero de resultados por p\u00e1gina y agregamos paginaci\u00f3n en la parte inferior si el n\u00famero excede esto.<\/p>\n<p>Estos son los posibles par\u00e1metros de filtro que crearemos para nuestra plantilla de b\u00fasqueda avanzada:<\/p>\n<ul>\n<li>Entrada de texto para buscar cualquier cadena dentro del t\u00edtulo de la publicaci\u00f3n y el contenido de la publicaci\u00f3n.<\/li>\n<li>Men\u00fa desplegable para elegir un g\u00e9nero. Permite elegir un t\u00e9rmino o dejarlo en \u00abCualquiera&quot;.<\/li>\n<li>Entrada para escribir el nombre del autor que busca en metadatos personalizados. La coincidencia aproximada, lo que significa ingresar &quot;Marca&quot;, devolver\u00e1 todos los autores cuyo nombre sea o contenga &quot;Marca&quot;.<\/li>\n<li>Entrada de n\u00famero para ingresar el a\u00f1o en que se public\u00f3 el libro que busca en metadatos personalizados. Coincidencia aproximada, lo que significa ingresar, por ejemplo, &quot;20&quot; coincidir\u00e1 con cualquier libro publicado en 1920 o cualquier a\u00f1o que comience con 20.<\/li>\n<li>Entrada para ingresar ISBN (<a href=\"https:\/\/en.wikipedia.org\/wiki\/International_Standard_Book_Number\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ID de libro<\/a> internacional) que busca en metadatos personalizados. Devuelve solo coincidencias precisas.<\/li>\n<li>Casilla de verificaci\u00f3n para incluir o no libros agotados, otro meta personalizado. De manera predeterminada, esto no est\u00e1 marcado, lo que significa que los resultados solo muestran los libros que est\u00e1n en stock.<\/li>\n<\/ul>\n<p>El formulario est\u00e1 configurado para usar el m\u00e9todo GET, lo que significa que cualquier par\u00e1metro buscado se agregar\u00e1 a la p\u00e1gina en la URL, en forma de &quot; <code>?book-search=world&amp;year-published=2016&amp;book-author=mark<\/code>&quot;. La otra opci\u00f3n si quieres evitar tener \u00abURLs feas\u00bb es usar Javascript y AJAX. Pero hay algunas desventajas con esto. En primer lugar, no ser\u00e1 posible marcar una b\u00fasqueda con par\u00e1metros de b\u00fasqueda espec\u00edficos &quot;precargados&quot;. Imagine que en otra parte de su sitio desea vincular directamente a su p\u00e1gina de b\u00fasqueda personalizada por un autor espec\u00edfico. Luego, puede hacer que el enlace vaya a su p\u00e1gina de b\u00fasqueda, agregue &quot; <code>?author=mark<\/code>&quot; y, por lo tanto, hacer clic en el enlace lo llevar\u00e1 directamente a los resultados de ese autor. Esto no es posible de lograr con AJAX.<\/p>\n<p>Los par\u00e1metros de b\u00fasqueda son mutuamente inclusivos. Esto significa que combinar, por ejemplo, el a\u00f1o &quot;2011&quot; y el autor &quot;Alg\u00fan tipo&quot; solo arrojar\u00e1 libros que coincidan con AMBOS. Si tambi\u00e9n especificamos &quot;gracioso&quot; en la entrada de texto de b\u00fasqueda general, solo obtendremos resultados que coincidan con los tres. Dicho en diferentes palabras; Usaremos la l\u00f3gica AND. Este es el m\u00e9todo m\u00e1s com\u00fan para filtrar los resultados de b\u00fasqueda.<\/p>\n<p>Este tutorial no incluir\u00e1 estilos, por lo que esta parte depende de usted. A continuaci\u00f3n se muestra un ejemplo de c\u00f3mo podr\u00eda verse esto con un estilo b\u00e1sico.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4caf8ea62c.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4caf8ea62c.png\" alt=\"C\u00f3mo crear una plantilla de b\u00fasqueda avanzada personalizada en WordPress\" ><\/a><\/p>\n<h2>Una nota sobre la paginaci\u00f3n con una consulta personalizada<\/h2>\n<p>Si desea paginaci\u00f3n en una consulta personalizada dentro de una sola p\u00e1gina, hay algunas cosas que debe tener en cuenta. La paginaci\u00f3n de una consulta se puede generar con las funciones de WordPress <code>[the_posts_pagination](https:\/\/developer.wordpress.org\/reference\/functions\/the_posts_pagination\/)()<\/code>, <code>[paginate_links](https:\/\/developer.wordpress.org\/reference\/functions\/paginate_links\/)()<\/code>, o las dos <code>[next_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/next_post_link\/)()<\/code>y <code>[previous_post_link](https:\/\/developer.wordpress.org\/reference\/functions\/previous_post_link\/)()<\/code>. Sin embargo, estos est\u00e1n codificados para funcionar con el objeto global <code>wp_query<\/code>(que para una plantilla de p\u00e1gina es la p\u00e1gina misma), y no una consulta personalizada.<\/p>\n<p>Existen algunas soluciones, como escribir una funci\u00f3n de paginaci\u00f3n usted mismo. O podr\u00eda usar la acci\u00f3n <code>pre_get_posts<\/code>y manipular el <code>wp_query<\/code>objeto. Desafortunadamente, este m\u00e9todo es demasiado tarde para afectar las funciones de paginaci\u00f3n. Otra alternativa es omitir la paginaci\u00f3n por completo y simplemente mostrar todas las publicaciones. Esta podr\u00eda ser una opci\u00f3n si no tiene muchas publicaciones, pero si est\u00e1 creando una plantilla de b\u00fasqueda personalizada avanzada, supongo que tiene bastantes publicaciones.<\/p>\n<p>Lo que haremos en esta gu\u00eda es una especie de m\u00e9todo \u00abhackish\u00bb. Dentro de la plantilla de p\u00e1gina, anularemos el <code>wp_query<\/code>objeto con nuestra consulta personalizada para que las funciones de bucle y paginaci\u00f3n funcionen como se esperaba. Este m\u00e9todo es con el que he tenido m\u00e1s \u00e9xito.<\/p>\n<p>Sin m\u00e1s pre\u00e1mbulos, \u00a1comencemos a programar!<\/p>\n<h2>Configuraci\u00f3n de tipos de publicaciones personalizadas, taxonom\u00eda y metacampos<\/h2>\n<p>El primer paso es definir el tipo de publicaci\u00f3n personalizada para la que queremos crear una plantilla de b\u00fasqueda avanzada. Si ya ha configurado un tipo de publicaci\u00f3n personalizado o desea implementarlo para publicaciones o p\u00e1ginas, puede pasar directamente a la siguiente parte.<\/p>\n<p>Estamos definiendo un tipo de publicaci\u00f3n personalizada <code>book<\/code>con una taxonom\u00eda personalizada jer\u00e1rquica <code>book_category<\/code>. No entrar\u00e9 en detalles explicando c\u00f3mo crear taxonom\u00edas y tipos de publicaciones personalizados aqu\u00ed. Si est\u00e1 interesado en obtener m\u00e1s informaci\u00f3n, tengo una publicaci\u00f3n que detalla esto.<\/p>\n<p>Coloque este c\u00f3digo en cualquier parte del c\u00f3digo de su tema <code>functions.php<\/code>o complemento:<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'taxonomies' =&gt; ['book_category'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],\n    ]);\n\u00a0\n    register_taxonomy('book_category', ['book'], [\n        'label' =&gt; __('Book Category', 'txtdomain'),\n        'hierarchical' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book-category'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book Category', 'txtdomain'),\n            'all_items' =&gt; __('All Book Categories', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Book Category', 'txtdomain'),\n            'view_item' =&gt; __('View Book Category', 'txtdomain'),\n            'update_item' =&gt; __('Update Book Category', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Book Category', 'txtdomain'),\n            'new_item_name' =&gt; __('New Book Category Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Book Categories', 'txtdomain'),\n            'parent_item' =&gt; __('Parent Book Category', 'txtdomain'),\n            'parent_item_colon' =&gt; __('Parent Book Category:', 'txtdomain'),\n            'not_found' =&gt; __('No Book Categories found', 'txtdomain'),\n        ]\n    ]);\n});<\/code><\/pre>\n<p>Esto dar\u00e1 como resultado un tipo de publicaci\u00f3n personalizada con una taxonom\u00eda adjunta en admin.<\/p>\n<p>La configuraci\u00f3n de la meta de publicaci\u00f3n personalizada depende un poco de usted: man\u00e9jela manualmente <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)()<\/code>o use el complemento <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Campos personalizados avanzados<\/a> (ACF), que es perfecto para este tipo de trabajo. Usar\u00e9 ACF para configurar los campos program\u00e1ticamente, as\u00ed:<\/p>\n<pre><code>if (function_exists('acf_add_local_field_group')) {\n    add_action('acf\/init', function() {\n        $fields = [\n            [\n                'key' =&gt; 'field_author',\n                'label' =&gt; __('Author(s)', 'txtdomain'),\n                'name' =&gt; 'book_author',\n                'type' =&gt; 'textarea',\n                'rows' =&gt; 3,\n                'new_lines' =&gt; 'wpautop',\n            ],\n            [\n                'key' =&gt; 'field_year_published',\n                'label' =&gt; __('Year published', 'txtdomain'),\n                'name' =&gt; 'year_published',\n                'type' =&gt; 'number',\n            ],\n            [\n                'key' =&gt; 'field_isbn',\n                'label' =&gt; __('ISBN', 'txtdomain'),\n                'name' =&gt; 'isbn',\n                'type' =&gt; 'text',\n            ],\n            [\n                'key' =&gt; 'field_in_stock',\n                'label' =&gt; __('Stock status', 'txtdomain'),\n                'name' =&gt; 'in_stock',\n                'type' =&gt; 'true_false',\n                'message' =&gt; __('In stock', 'txtdomain'),\n                'default_value' =&gt; 1,\n            ],\n        ];\n\u00a0\n        acf_add_local_field_group([\n            'key' =&gt; 'group_book_fields',\n            'title' =&gt; __('Book Details', 'txtdomain'),\n            'fields' =&gt; $fields,\n            'label_placement' =&gt; 'top',\n            'menu_order' =&gt; 0,\n            'style' =&gt; 'default',\n            'position' =&gt; 'normal',\n            'location' =&gt; [\n                [\n                    [\n                        'param' =&gt; 'post_type',\n                        'operator' =&gt; '==',\n                        'value' =&gt; 'book'\n                    ]\n                ]\n            ],\n        ]);\n    });\n}<\/code><\/pre>\n<p>Por supuesto, puede configurar los campos de ACF utilizando la GUI de administraci\u00f3n de ACF. Pero hay varios beneficios de agregarlos por c\u00f3digo. Por ejemplo, aseg\u00farese de mantener los mismos campos dondequiera que active su tema o complemento. Si configura los campos en el administrador, debe recordar exportarlos e importarlos si cambia el sitio de WordPress.<\/p>\n<p>Tenga en cuenta los meta nombres; por ejemplo <code>book_author<\/code>, <code>year_published<\/code>, y as\u00ed sucesivamente. Los consultar\u00e1 cuando creemos la consulta personalizada en la plantilla de b\u00fasqueda avanzada.<\/p>\n<p>Con el complemento ACF y el c\u00f3digo anterior, editar un solo libro se ver\u00eda as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4cafa3c2c8.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4cafa3c2c8.png\" alt=\"C\u00f3mo crear una plantilla de b\u00fasqueda avanzada personalizada en WordPress\" ><\/a><\/p>\n<p>Con esto todos estamos bien para crear tantas publicaciones de libros como queramos. El siguiente paso es crear la plantilla de p\u00e1gina para nuestra b\u00fasqueda.<\/p>\n<h2>Creaci\u00f3n de la plantilla de p\u00e1gina<\/h2>\n<p>Vamos a crear la plantilla de p\u00e1gina donde pondremos nuestra plantilla de b\u00fasqueda avanzada. Haz una copia de tu tema <code>single.php<\/code>y <code>page.php<\/code>c\u00e1mbiale el nombre a, por ejemplo <code>template-booksearch.php<\/code>,. El HTML depende de usted, pero la raz\u00f3n por la que hacemos una copia de una sola o una p\u00e1gina es porque probablemente son la plantilla m\u00e1s cercana en t\u00e9rminos de dise\u00f1o.<\/p>\n<p>En la parte superior de la plantilla de p\u00e1gina, indicamos que se trata de una plantilla de p\u00e1gina escribiendo &quot;Nombre de la plantilla&quot; y su nombre dentro del bloque de comentarios. Al hacer esto, nos aseguraremos de que podamos seleccionar la plantilla de p\u00e1gina cuando editemos una p\u00e1gina.<\/p>\n<pre><code>&lt;?php \/* Template Name: Advanced Book Search *\/\nget_header(); ?&gt;\n...<\/code><\/pre>\n<p>Las secciones que necesitamos codificar en nuestra plantilla son las siguientes, en este orden:<\/p>\n<ol>\n<li>Almacene todas las variables previamente enviadas por el formulario, usando <code>get_query_var()<\/code>. Tambi\u00e9n es necesario almacenar la p\u00e1gina actual<\/li>\n<li>Representar el formulario de b\u00fasqueda con un bot\u00f3n de env\u00edo para realizar una b\u00fasqueda<\/li>\n<li>Restablecer el <code>wp_query<\/code>objeto<\/li>\n<li>Configure los argumentos para un nuevo <code>WP_Query()<\/code>seg\u00fan los par\u00e1metros buscados y ejecute la consulta. Asigne la consulta personalizada al <code>wp_query<\/code>objeto<\/li>\n<li>Recorra los resultados y mu\u00e9strelos. Tambi\u00e9n renderizar enlaces de paginaci\u00f3n.<\/li>\n<li>Restablecer el <code>wp_query<\/code>objeto de nuevo a lo que era<\/li>\n<\/ol>\n<p>La raz\u00f3n por la que necesitamos almacenar todas las variables buscadas y la p\u00e1gina actual temprano es porque estas variables se perder\u00e1n una vez que restablezcamos el <code>wp_query<\/code>objeto en el paso 3. Tambi\u00e9n necesitamos las variables para nuestro formulario de b\u00fasqueda, para completar los campos.<\/p>\n<p>En su plantilla, decida el lugar donde desea generar su b\u00fasqueda personalizada, y comencemos en la parte superior:<\/p>\n<h3>1 Obtener todas las variables buscadas<\/h3>\n<p>Obtenemos los par\u00e1metros GET (de la URL) con <code>[get_query_var](https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/)()<\/code>. Por ejemplo; si tenemos un par\u00e1metro <code>?book-author=benjamin<\/code>en la URL, usar <code>get_query_var('book-author')<\/code>devolver\u00eda la cadena &#8216; <code>benjamin<\/code>&#8216;. La obtenci\u00f3n de todas las variables se puede hacer as\u00ed:<\/p>\n<pre><code>$search_string = get_query_var('book-search');\n$author = get_query_var('book-author');\n$category = get_query_var('book-category');\n$year = get_query_var('year-published');\n$isbn = get_query_var('isbn');\n$out_of_stock = get_query_var('out-of-stock');<\/code><\/pre>\n<p>Pero todos estos son par\u00e1metros personalizados que no forman parte de los par\u00e1metros GET est\u00e1ndar de WordPress. WordPress ignorar\u00e1 cualquier par\u00e1metro GET que no conozca, por lo que llamar a estos siempre devolver\u00e1 una cadena vac\u00eda. Necesitamos decirle a WordPress que permita cada uno de estos par\u00e1metros GET. Hacemos esto filtrando <code>query_vars<\/code>. En su <code>functions.php<\/code>, agregue esto tambi\u00e9n:<\/p>\n<pre><code>add_filter('query_vars', function($vars) {\n    $vars[] = 'book-search';\n    $vars[] = 'book-author';\n    $vars[] = 'book-category';\n    $vars[] = 'year-published';\n    $vars[] = 'isbn';\n    $vars[] = 'out-of-stock';\n    return $vars;\n});<\/code><\/pre>\n<p>Ahora nuestro <code>get_query_var()<\/code>&#8216;s deber\u00eda poder obtener los par\u00e1metros GET. Si no est\u00e1n configurados, devuelve una cadena vac\u00eda.<\/p>\n<p>Tambi\u00e9n necesitamos buscar la p\u00e1gina actual antes de estropear el <code>wp_query<\/code>objeto. La p\u00e1gina actual es un par\u00e1metro GET oculto llamado <code>paged<\/code>. Lo buscaremos de la misma manera que nuestros otros par\u00e1metros GET, pero lo configuraremos de forma predeterminada en 1 si est\u00e1 vac\u00edo.<\/p>\n<pre><code>$paged = (get_query_var('paged'))? get_query_var('paged'): 1;<\/code><\/pre>\n<p>Nota: Como <code>paged<\/code>es un par\u00e1metro est\u00e1ndar de WordPress, no necesitamos agregarlo <code>paged<\/code>al <code>query_vars<\/code>filtro.<\/p>\n<h3>2 Renderizar el formulario de b\u00fasqueda<\/h3>\n<p>El formulario de b\u00fasqueda ser\u00e1 simplemente un <code>&lt;form&gt;<\/code>con las entradas necesarias y un bot\u00f3n de env\u00edo de formulario. El HTML depende completamente de usted, en el siguiente ejemplo, estoy agregando las entradas en una lista simple. No incluir\u00e9 ning\u00fan estilo en este tutorial, depende de ti. Puede optar por dise\u00f1ar el formulario de b\u00fasqueda para que resida en la parte superior de los resultados, o al costado, verticalmente hacia abajo junto con los resultados de la b\u00fasqueda.<\/p>\n<p>Nota: para acortar y modularizar la plantilla de b\u00fasqueda avanzada, puede separar la parte del formulario de b\u00fasqueda en un archivo de plantilla independiente e incluirlo con <code>[get_template_part](https:\/\/developer.wordpress.org\/reference\/functions\/get_template_part\/)()<\/code>. Pero por la simplicidad de este tutorial, incluir\u00e9 todo dentro del archivo de plantilla.<\/p>\n<p>El formulario en s\u00ed debe ser del m\u00e9todo GET, y la acci\u00f3n debe apuntar a la p\u00e1gina en la que estamos. Para ello accedemos al <code>$post<\/code>objeto global y de ah\u00ed obtenemos el enlace permanente. Al final, agregamos un bot\u00f3n de env\u00edo que enviar\u00e1 el formulario.<\/p>\n<pre><code>global $post;\n?&gt;\n&lt;form method=\"GET\" action=\"&lt;?php echo get_permalink($post-&gt;ID); ?&gt;\"&gt;\n    &lt;ul class=\"book-search-form\"&gt;\n\u00a0\n    &lt;\/ul&gt;\n    &lt;input type=\"submit\" value=\"&lt;?php _e('Search', 'txtdomain'); ?&gt;\" \/&gt;\n&lt;\/form&gt;\n&lt;?php<\/code><\/pre>\n<p>Dentro de la lista desordenada, agregaremos una entrada adecuada para cada uno de nuestros posibles par\u00e1metros de b\u00fasqueda. Ajuste el HTML y los par\u00e1metros de b\u00fasqueda para que se ajusten a sus necesidades:<\/p>\n<pre><code>global $post;\n?&gt;\n&lt;form method=\"GET\" action=\"&lt;?php echo get_permalink($post-&gt;ID); ?&gt;\"&gt;\n    &lt;ul class=\"book-search-form\"&gt;\n        &lt;li&gt;\n            &lt;label for=\"book-search\"&gt;&lt;?php _e('Search...', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" id=\"book-search\" name=\"book-search\" value=\"&lt;?php echo $search_string; ?&gt;\" \/&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;label for=\"book-category\"&gt;&lt;?php _e('Genre', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;?php \n            wp_dropdown_categories([\n                'taxonomy' =&gt; 'book_category',\n                'name' =&gt; 'book-category',\n                'id' =&gt; 'book-category',\n                'value_field' =&gt; 'slug',\n                'selected' =&gt; $category,\n                'show_option_none' =&gt; __('Any genre', 'txtdomain'),\n                'option_none_value' =&gt; '',\n                'hierarchical' =&gt; true,\n                'hide_if_empty' =&gt; false,\n            ]);\n            ?&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;label for=\"book-author\"&gt;&lt;?php _e('Author', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" id=\"book-author\" name=\"book-author\" value=\"&lt;?php echo $author; ?&gt;\" \/&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;label for=\"year-published\"&gt;&lt;?php _e('Year published', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"number\" id=\"year-published\" name=\"year-published\" value=\"&lt;?php echo $year; ?&gt;\" \/&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;label for=\"isbn\"&gt;&lt;?php _e('ISBN', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" id=\"isbn\" name=\"isbn\" value=\"&lt;?php echo $isbn; ?&gt;\" \/&gt;\n        &lt;\/li&gt;\n        &lt;li&gt;\n            &lt;input type=\"checkbox\" id=\"out-of-stock\" name=\"out-of-stock\" value=\"out-of-stock\" &lt;?php checked($out_of_stock, 'out-of-stock'); ?&gt; \/&gt;&lt;label for=\"out-of-stock\"&gt;&lt;?php _e('Include out of stock', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;\/li&gt;\n    &lt;\/ul&gt;\n    &lt;input type=\"submit\" value=\"&lt;?php _e('Search', 'txtdomain'); ?&gt;\" \/&gt;\n&lt;\/form&gt;\n&lt;?php<\/code><\/pre>\n<p>Tome nota de los <code>name<\/code>atributos; son lo que aparecer\u00e1 en la URL cuando se env\u00ede el formulario. \u00a1Deben corresponder a los <code>query_vars<\/code>y <code>get_query_var()<\/code>que hemos definido anteriormente!<\/p>\n<p>El c\u00f3digo anterior comienza con la representaci\u00f3n de una entrada de texto para la b\u00fasqueda de texto general. Establecemos el <code>value<\/code>a la variable buscada previamente que buscamos usando <code>get_query_var()<\/code>. Esto asegura que la entrada no se borre despu\u00e9s de que hayamos hecho una b\u00fasqueda.<\/p>\n<p>El siguiente par\u00e1metro es un men\u00fa desplegable de g\u00e9nero de nuestra taxonom\u00eda personalizada. Para representar esto utilizamos la funci\u00f3n <code>[wp_dropdown_categories](https:\/\/developer.wordpress.org\/reference\/functions\/wp_dropdown_categories\/)()<\/code>. Eche un vistazo a la p\u00e1gina de documentaci\u00f3n para ver por qu\u00e9 agregamos todos estos par\u00e1metros para ajustar el men\u00fa desplegable a nuestras necesidades. Es importante que <code>taxonomy<\/code>se establezca en nuestra taxonom\u00eda personalizada, el <code>name<\/code>atributo es correcto y <code>selected<\/code>se establece en el valor de la variable buscada anteriormente. Tambi\u00e9n configuramos los valores de los t\u00e9rminos para que sean sus slugs en lugar de los ID de los t\u00e9rminos. Se ve mejor con <code>?book-category=fiction<\/code>en lugar de <code>?book-category=42<\/code>. Tambi\u00e9n activamos una opci\u00f3n de \u00abninguno\u00bb para agregar una opci\u00f3n de \u00abCualquier g\u00e9nero\u00bb.<\/p>\n<p>A continuaci\u00f3n, representamos otra entrada de texto para buscar el autor, una entrada de n\u00famero para el a\u00f1o de publicaci\u00f3n, una entrada de texto para el n\u00famero ISBN y, finalmente, una casilla de verificaci\u00f3n que est\u00e1 desmarcada de forma predeterminada para incluir libros agotados.<\/p>\n<h3>3 Restablecer el wp_query<\/h3>\n<p>El siguiente paso es un peque\u00f1o truco para garantizar que la paginaci\u00f3n funcione para nuestra consulta personalizada. Simplemente almacenamos la corriente <code>$wp_query<\/code>en alguna variable y luego la configuramos en <code>null<\/code>. Posteriormente, en el paso 6 lo reseteamos desde la <code>$tmp_wpquery<\/code>variable.<\/p>\n<pre><code>$tmp_wpquery = $wp_query;\n$wp_query = null;<\/code><\/pre>\n<h3>4 Configure argumentos y ejecute consultas personalizadas<\/h3>\n<p>Esta parte se trata de realizar una nueva consulta. Comenzamos configurando los argumentos m\u00e1s b\u00e1sicos, y luego agregamos condicionalmente par\u00e1metros dependiendo de lo que se encontr\u00f3 en las variables buscadas previamente (de nuestro <code>get_query_var()<\/code>s).<\/p>\n<pre><code>$args = [\n    'post_type' =&gt; 'book',\n    'posts_per_page' =&gt; 20,\n    'paged' =&gt; $paged\n];\n\u00a0\n$meta_query = [];\n$tax_query = [];\n\u00a0\nif (!empty($search_string)) {\n    $args['s'] = $search_string;\n}\n\u00a0\nif (!empty($category)) {\n    $tax_query[] = [\n        'taxonomy' =&gt; 'book_category',\n        'field' =&gt; 'slug',\n        'terms' =&gt; $category\n    ];\n}\n\u00a0\nif (!empty($author)) {\n    $meta_query[] = [\n        'key' =&gt; 'book_author',\n        'value' =&gt; $author,\n        'compare' =&gt; 'LIKE'\n    ];\n}\n\u00a0\nif (!empty($year)) {\n    $year = (int) $year;\n    $meta_query[] = [\n        'key' =&gt; 'year_published',\n        'value' =&gt; $year,\n        'compare' =&gt; 'LIKE'\n    ];\n}\n\u00a0\nif (!empty($isbn)) {\n    $meta_query[] = [\n        'key' =&gt; 'isbn',\n        'value' =&gt; $isbn,\n    ];\n}\n\u00a0\nif (empty($out_of_stock)) {\n    $meta_query[] = [\n        'key' =&gt; 'in_stock',\n        'value' =&gt; true,\n    ];\n}\n\u00a0\nif (!empty($meta_query)) {\n    $args['meta_query'] = $meta_query;\n}\nif (!empty($tax_query)) {\n    $args['tax_query'] = $tax_query;\n}\n\u00a0\n\/\/ Perform query and assign it to wp_query\n$books = new WP_Query($args);\n$wp_query = $books;<\/code><\/pre>\n<p>El c\u00f3digo anterior b\u00e1sicamente est\u00e1 construyendo un <code>WP_Query<\/code>con par\u00e1metros. 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<\/a> de <code>WP_Query<\/code>es un gran recurso para averiguar c\u00f3mo crear una consulta.<\/p>\n<p>Los primeros argumentos aseguran que solo consultemos libros y que estemos informando correctamente sobre en qu\u00e9 p\u00e1gina nos encontramos actualmente, a partir de la <code>paged<\/code>variable que obtuvimos anteriormente. El n\u00famero de publicaciones por p\u00e1gina depende de usted, simplemente lo configur\u00e9 en 20.<\/p>\n<p>Tenga en cuenta que agregar &#8216; <code>compare<\/code>&#8216; a &#8216; <code>LIKE<\/code>&#8216; har\u00e1 que WordPress busque cualquier cosa que contenga la cadena dada. No agregu\u00e9 esto a la b\u00fasqueda de ISBN porque para este campo quiero que encuentre resultados que coincidan perfectamente.<\/p>\n<p>Lo importante est\u00e1 justo al final, cuando realmente realizamos la consulta y asignamos esa consulta a la <code>wp_query<\/code>variable.<\/p>\n<h3>5 Recorra los resultados de la consulta y renderice la paginaci\u00f3n<\/h3>\n<p>Este paso es realmente f\u00e1cil. Todo lo que necesitamos es un bucle est\u00e1ndar y, para cada uno, renderizamos la publicaci\u00f3n del libro como queramos. Esta parte depende completamente de ti.<\/p>\n<p>El siguiente c\u00f3digo muestra un ejemplo b\u00e1sico de recorrer los resultados, llamando <code>get_template_part()<\/code>a cada publicaci\u00f3n. After the loop <code>the_posts_pagination()<\/code>se usa para representar enlaces de paginaci\u00f3n. Si la consulta no devolvi\u00f3 publicaciones, se muestra un p\u00e1rrafo simple con un texto.<\/p>\n<pre><code>if (have_posts()) { \n    while (have_posts()): the_post();\n        get_template_part('content', 'book');\n    endwhile;\n\u00a0\n    the_posts_pagination([\n        'mid_size' =&gt; 2,\n        'prev_text' =&gt; __('\u00ab Previous', 'txdomain'),\n        'next_text' =&gt; __('Next \u00bb', 'txdomain')\n    ]);\n} else {\n    ?&gt;&lt;p class=\"no-posts\"&gt;&lt;?php _e('No books found.', 'txdomain'); ?&gt;&lt;\/p&gt;&lt;?php\n}<\/code><\/pre>\n<p>Ajuste el HTML y la salida para satisfacer sus necesidades. El c\u00f3digo anterior espera un archivo de plantilla en el tema nombrado <code>content-book.php<\/code>para representar un solo libro en el ciclo. No le mostrar\u00e9 c\u00f3mo renderizar cada publicaci\u00f3n, ya que es algo sobre lo que probablemente ya tenga control.<\/p>\n<h3>6 Restablecer el wp_query de nuevo a lo que era<\/h3>\n<p>El paso final es restablecer el <code>wp_query<\/code>objeto a lo que almacenamos anteriormente en el paso 3. Lo configuramos <code>null<\/code>primero para asegurarnos de que se restablezca.<\/p>\n<pre><code>$wp_query = null;\n$wp_query = $tmp_wpquery;<\/code><\/pre>\n<h2>Conclusi\u00f3n y resultado final.<\/h2>\n<p>\u00a1Y eso fue todo! Ahora deber\u00eda tener una plantilla de b\u00fasqueda personalizada avanzada totalmente funcional. Espero que esto haya sido de alguna ayuda para usted: el c\u00f3digo se ha escrito de la manera m\u00e1s general posible para que le resulte m\u00e1s f\u00e1cil adaptarse a sus necesidades. \u00a1Quiz\u00e1s desee diferentes tipos de par\u00e1metros, o su tipo de publicaci\u00f3n personalizada es para pel\u00edculas o algo m\u00e1s!<\/p>\n<p>Con un estilo b\u00e1sico, puede verse f\u00e1cilmente as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4caf8ea62c.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151388-61e4caf8ea62c.png\" alt=\"C\u00f3mo crear una plantilla de b\u00fasqueda avanzada personalizada en WordPress\" ><\/a><\/p>\n<p>Aqu\u00ed est\u00e1 el c\u00f3digo final; la <code>functions.php<\/code>pieza y la plantilla:<\/p>\n<pre><code>\/\/ Custom post type for books and custom taxonomy\nadd_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'taxonomies' =&gt; ['book_category'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],\n    ]);\n\u00a0\n    register_taxonomy('book_category', ['book'], [\n        'label' =&gt; __('Book Category', 'txtdomain'),\n        'hierarchical' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book-category'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book Category', 'txtdomain'),\n            'all_items' =&gt; __('All Book Categories', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Book Category', 'txtdomain'),\n            'view_item' =&gt; __('View Book Category', 'txtdomain'),\n            'update_item' =&gt; __('Update Book Category', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Book Category', 'txtdomain'),\n            'new_item_name' =&gt; __('New Book Category Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Book Categories', 'txtdomain'),\n            'parent_item' =&gt; __('Parent Book Category', 'txtdomain'),\n            'parent_item_colon' =&gt; __('Parent Book Category:', 'txtdomain'),\n            'not_found' =&gt; __('No Book Categories found', 'txtdomain'),\n        ]\n    ]);\n});\n\u00a0\n\/\/ ACF for custom meta fields\nif (function_exists('acf_add_local_field_group')) {\n    add_action('acf\/init', function() {\n        $fields = [\n            [\n                'key' =&gt; 'field_author',\n                'label' =&gt; __('Author(s)', 'txtdomain'),\n                'name' =&gt; 'book_author',\n                'type' =&gt; 'textarea',\n                'rows' =&gt; 3,\n                'new_lines' =&gt; 'wpautop',\n            ],\n            [\n                'key' =&gt; 'field_year_published',\n                'label' =&gt; __('Year published', 'txtdomain'),\n                'name' =&gt; 'year_published',\n                'type' =&gt; 'number',\n            ],\n            [\n                'key' =&gt; 'field_isbn',\n                'label' =&gt; __('ISBN', 'txtdomain'),\n                'name' =&gt; 'isbn',\n                'type' =&gt; 'text',\n            ],\n            [\n                'key' =&gt; 'field_in_stock',\n                'label' =&gt; __('Stock status', 'txtdomain'),\n                'name' =&gt; 'in_stock',\n                'type' =&gt; 'true_false',\n                'message' =&gt; __('In stock', 'txtdomain'),\n                'default_value' =&gt; 1,\n            ],\n        ];\n\u00a0\n        acf_add_local_field_group([\n            'key' =&gt; 'group_book_fields',\n            'title' =&gt; __('Book Details', 'txtdomain'),\n            'fields' =&gt; $fields,\n            'label_placement' =&gt; 'top',\n            'menu_order' =&gt; 0,\n            'style' =&gt; 'default',\n            'position' =&gt; 'normal',\n            'location' =&gt; [\n                [\n                    [\n                        'param' =&gt; 'post_type',\n                        'operator' =&gt; '==',\n                        'value' =&gt; 'book'\n                    ]\n                ]\n            ],\n        ]);\n    });\n}\n\u00a0\n\/\/ Allow custom GET parameters\nadd_filter('query_vars', function($vars) {\n    $vars[] = 'book-search';\n    $vars[] = 'book-author';\n    $vars[] = 'book-category';\n    $vars[] = 'year-published';\n    $vars[] = 'isbn';\n    $vars[] = 'out-of-stock';\n    return $vars;\n});<\/code><\/pre>\n<pre><code>&lt;?php \n\/* Template Name: Advanced Book Search *\/\nget_header(); ?&gt;\n\u00a0\n&lt;main class=\"content\"&gt;\n    &lt;?php \n\u00a0\n    \/\/ Store variables\n    $paged = (get_query_var('paged'))? get_query_var('paged'): 1;\n    $search_string = get_query_var('book-search');\n    $author = get_query_var('book-author');\n    $category = get_query_var('book-category');\n    $year = get_query_var('year-published');\n    $isbn = get_query_var('isbn');\n    $out_of_stock = get_query_var('out-of-stock');\n\u00a0\n    \/\/ Search form\n    global $post;\n    ?&gt;&lt;form method=\"GET\" action=\"&lt;?php echo get_permalink($post-&gt;ID); ?&gt;\"&gt;\n        &lt;ul class=\"book-search-form\"&gt;\n            &lt;li&gt;\n                &lt;label for=\"book-search\"&gt;&lt;?php _e('Search...', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;input type=\"text\" id=\"book-search\" name=\"book-search\" value=\"&lt;?php echo $search_string; ?&gt;\" \/&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;label for=\"book-category\"&gt;&lt;?php _e('Genre', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;?php \n                wp_dropdown_categories([\n                    'taxonomy' =&gt; 'book_category',\n                    'name' =&gt; 'book-category',\n                    'id' =&gt; 'book-category',\n                    'value_field' =&gt; 'slug',\n                    'selected' =&gt; $category,\n                    'show_option_none' =&gt; __('Any genre', 'txtdomain'),\n                    'option_none_value' =&gt; '',\n                    'hierarchical' =&gt; true,\n                    'hide_if_empty' =&gt; false,\n                ]);\n                ?&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;label for=\"book-author\"&gt;&lt;?php _e('Author', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;input type=\"text\" id=\"book-author\" name=\"book-author\" value=\"&lt;?php echo $author; ?&gt;\" \/&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;label for=\"year-published\"&gt;&lt;?php _e('Year published', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;input type=\"number\" id=\"year-published\" name=\"year-published\" value=\"&lt;?php echo $year; ?&gt;\" \/&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;label for=\"isbn\"&gt;&lt;?php _e('ISBN', 'txtdomain'); ?&gt;&lt;\/label&gt;\n                &lt;input type=\"text\" id=\"isbn\" name=\"isbn\" value=\"&lt;?php echo $isbn; ?&gt;\" \/&gt;\n            &lt;\/li&gt;\n            &lt;li&gt;\n                &lt;input type=\"checkbox\" id=\"out-of-stock\" name=\"out-of-stock\" value=\"out-of-stock\" &lt;?php checked($out_of_stock, 'out-of-stock'); ?&gt; \/&gt;&lt;label for=\"out-of-stock\"&gt;&lt;?php _e('Include out of stock', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;\/li&gt;\n        &lt;\/ul&gt;\n        &lt;input type=\"submit\" value=\"&lt;?php _e('Search', 'txtdomain'); ?&gt;\" \/&gt;\n    &lt;\/form&gt;\n    &lt;?php\n\u00a0\n    \/\/ Reset wp_query temporary\n    $tmp_wpquery = $wp_query;\n    $wp_query = null;\n\u00a0\n    \/\/ Start setting up custom query\n    $args = [\n        'post_type' =&gt; 'book',\n        'posts_per_page' =&gt; 20,\n        'paged' =&gt; $paged\n    ];\n\u00a0\n    $meta_query = [];\n    $tax_query = [];\n\u00a0\n    \/\/ Search post title and content\n    if (!empty($search_string)) {\n        $args['s'] = $search_string;\n    }\n\u00a0\n    \/\/ Search by category\n    if (!empty($category)) {\n        $tax_query[] = [\n            'taxonomy' =&gt; 'book_category',\n            'field' =&gt; 'slug',\n            'terms' =&gt; $category\n        ];\n    }\n\u00a0\n    \/\/ Search by ISBN\n    if (!empty($author)) {\n        $meta_query[] = [\n            'key' =&gt; 'book_author',\n            'value' =&gt; $author,\n            'compare' =&gt; 'LIKE'\n        ];\n    }\n\u00a0\n    \/\/ Search by year\n    if (!empty($year)) {\n        $year = (int) $year;\n        $meta_query[] = [\n            'key' =&gt; 'year_published',\n            'value' =&gt; $year,\n            'compare' =&gt; 'LIKE'\n        ];\n    }\n\u00a0\n    \/\/ Search by ISBN\n    if (!empty($isbn)) {\n        $meta_query[] = [\n            'key' =&gt; 'isbn',\n            'value' =&gt; $isbn,\n        ];\n    }\n\u00a0\n    \/\/ Filter out of stock\n    if (empty($out_of_stock)) {\n        $meta_query[] = [\n            'key' =&gt; 'in_stock',\n            'value' =&gt; true,\n        ];\n    }\n\u00a0\n    \/\/ Add to query arguments\n    if (!empty($meta_query)) {\n        $args['meta_query'] = $meta_query;\n    }\n    if (!empty($tax_query)) {\n        $args['tax_query'] = $tax_query;\n    }\n\u00a0\n    \/\/ Perform query and assign it to wp_query\n    $books = new WP_Query($args);\n    $wp_query = $books;\n\u00a0\n    \/\/ Loop through results\n    if (have_posts()) { \n        while (have_posts()): the_post();\n            get_template_part('content', 'book');\n        endwhile;\n\u00a0\n        the_posts_pagination([\n            'mid_size' =&gt; 2,\n            'prev_text' =&gt; __('\u00ab Previous', 'txdomain'),\n            'next_text' =&gt; __('Next \u00bb', 'txdomain')\n        ]);\n    } else {\n        ?&gt;&lt;p class=\"no-posts\"&gt;&lt;?php _e('No books found.', 'txdomain'); ?&gt;&lt;\/p&gt;&lt;?php\n    }\n\u00a0\n    \/\/ Reset wp_query back to what it was\n    $wp_query = null;\n    $wp_query = $tmp_wpquery;\n    ?&gt;\n&lt;\/main&gt;\n&lt;?php get_footer(); ?&gt;<\/code><\/pre>\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>Este tutorial es para usted que tiene un tipo de publicaci\u00f3n personalizada y desea crear una p\u00e1gina de b\u00fasqueda avanzada personalizada con campos y par\u00e1metros de b\u00fasqueda personalizados.<\/p>\n","protected":false},"author":1,"featured_media":151389,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,892,716,716,831,914,1110,914,831,840,840,861,861],"tags":[1172],"class_list":["post-233946","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","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\/233946","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=233946"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233946\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/151389"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}