{"id":231477,"date":"2023-01-01T16:25:00","date_gmt":"2023-01-01T13:25:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231477"},"modified":"2022-12-25T21:57:29","modified_gmt":"2022-12-25T18:57:29","slug":"buscar-metadatos-de-publicaciones-en-el-area-de-administracion-de-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/buscar-metadatos-de-publicaciones-en-el-area-de-administracion-de-wordpress\/","title":{"rendered":"Buscar metadatos de publicaciones en el \u00e1rea de administraci\u00f3n de WordPress"},"content":{"rendered":"\n<p>Despu\u00e9s de haber trabajado con WordPress durante un per\u00edodo de tiempo prolongado, es probable que haya trabajado con metadatos de publicaciones de alguna manera. Tal vez simplemente ley\u00f3 los metadatos de la base de datos, o tal vez tambi\u00e9n escribi\u00f3 y ley\u00f3 en la tabla de la base de datos.<\/p>\n<p>Puede ser una API realmente poderosa siempre que necesite asociar cierta informaci\u00f3n con sus publicaciones (o, si le gusta abstraer a\u00fan m\u00e1s las cosas, con sus modelos).<\/p>\n<p>Dicho esto, \u00bfqu\u00e9 sucede cuando desea incluir informaci\u00f3n de la tabla de metadatos pero no tiene la comodidad de complementos como <a href=\"https:\/\/searchwp.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SearchWP<\/a> o <a href=\"https:\/\/www.relevanssi.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Relevanssi<\/a>? <\/p>\n<p>Adem\u00e1s, suponga que el caso de uso es solo para administradores y solo para el \u00e1rea de administraci\u00f3n de WordPress. Es decir, desea buscar sus publicaciones desde la pantalla <strong>Todas<\/strong> las publicaciones, pero tambi\u00e9n desea incluir los metadatos de la publicaci\u00f3n en los criterios de b\u00fasqueda.<\/p>\n<p>\u00bfEntonces que?<\/p>\n<h2>Buscar metadatos de publicaciones<\/h2>\n<p>Fuera de la caja, cada vez que busque publicaciones en el \u00e1rea de administraci\u00f3n de WordPress, buscar\u00e1 una frase en el t\u00edtulo de la publicaci\u00f3n, el extracto de la publicaci\u00f3n y el contenido de la publicaci\u00f3n y luego devolver\u00e1 esos resultados.<\/p>\n<p>Entonces, para expandir la b\u00fasqueda para incluir metadatos de publicaciones, tenemos que actualizar la consulta que se ejecuta para que incorpore las tablas de metadatos de publicaciones. Pero hay m\u00e1s que eso. Espec\u00edficamente, para obtener la mayor flexibilidad y la mejor experiencia de usuario, querr\u00e1:<\/p>\n<ul>\n<li>incluir partes de una frase para que no solo busque algo palabra por palabra en el art\u00edculo,<\/li>\n<li>y, por supuesto, manejar adecuadamente el caso de que no se ingrese ning\u00fan t\u00e9rmino de b\u00fasqueda para que la pantalla <strong>Todas<\/strong> las publicaciones a\u00fan se pueda ver en su formato est\u00e1ndar.<\/li>\n<\/ul>\n<p>Esto significa que no solo necesitamos modificar la consulta de b\u00fasqueda para incluir una clave meta y un valor meta, sino que necesitamos escapar correctamente frases completas para que podamos usar una <code>LIKE<\/code>operaci\u00f3n en lugar de una <code>IN<\/code>operaci\u00f3n u <code>=<\/code>operaci\u00f3n.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159257-61e6f01916b5c.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-159257-61e6f01916b5c.png\" alt=\"Buscar metadatos de publicaciones en el \u00e1rea de administraci\u00f3n de WordPress\" ><\/a><\/p>\n<p>Algunas de las cosas que es importante saber antes de leer el resto de este art\u00edculo incluyen:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a><\/li>\n<li>El gancho <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/posts_where\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">posts_where<\/a><\/li>\n<li>El gancho <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a><\/li>\n<li>Expresiones regulares con <a href=\"https:\/\/www.php.net\/manual\/en\/function.preg-replace.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">preg_replace<\/a><\/li>\n<li>Funciones auxiliares de WordPress, a saber, <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/esc_sql\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esc_sql<\/a>.<\/li>\n<\/ul>\n<p>En \u00faltima instancia, necesitaremos usar dos ganchos con dos funciones personalizadas. Y debido a que no puedo proporcionar un ejemplo completo de c\u00f3mo se ver\u00eda esto en su caso de uso, el c\u00f3digo debe generalizarse un poco.<\/p>\n<h3>Conexi\u00f3n a la b\u00fasqueda<\/h3>\n<p>En la siguiente esencia, ver\u00e1s tres cosas:<\/p>\n<ol>\n<li>Verificaci\u00f3n de que el usuario est\u00e1 en el \u00e1rea de administraci\u00f3n y est\u00e1 en la p\u00e1gina de edici\u00f3n.<\/li>\n<li>El usuario ha introducido una b\u00fasqueda.<\/li>\n<li>La frase de b\u00fasqueda se convirti\u00f3 en una matriz, se escap\u00f3 y se agreg\u00f3 a la propiedad de metaconsulta de la instancia de WP_Query.<\/li>\n<\/ol>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/4f2fa607bf002f52a7a8d1e08f75d86a#file-00-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ver a continuaci\u00f3n<\/a> :<\/p>\n<pre><code>&lt;?php\nadd_filter('pre_get_posts', function ($query) {\n\n    \/\/ Make sure we're in the admin, an administrator, and on the edit page.\n    if (!is_admin() || !current_user_can('manage_options') || 'edit' !== get_current_screen()-&gt;base) {\n        return;\n    }\n\n    \/\/ Determine if the user is running a search.\n    $search = filter_input(INPUT_GET, 's', FILTER_SANITIZE_STRING);\n    if (empty($search)) {\n        return;\n    }\n\n    $query-&gt;set(\n        'meta_query',\n        [\n            [\n                'key'     =&gt; 'headline_notes',\n                'value'   =&gt; esc_sql(preg_replace('\/s+?\/', '%', $search)), \/\/ For flexible search, make sure to replace all white space with % for LIKE.\n                'compare' =&gt; 'LIKE',\n            ],\n        ]\n    );\n});<\/code><\/pre>\n<p>Suponiendo que todo lo anterior sea cierto, esto actualizar\u00e1 la consulta que se ejecuta en la base de datos de WordPress antes de que se muestre la siguiente p\u00e1gina para que los resultados incluyan la informaci\u00f3n de los metadatos.<\/p>\n<h3>Actualizaci\u00f3n de la cl\u00e1usula WHERE<\/h3>\n<p>Sin embargo, antes de que terminemos, tambi\u00e9n debemos asegurarnos de actualizar la consulta que se est\u00e1 ejecutando.<\/p>\n<p>De forma predeterminada, la consulta se genera mediante una <code>AND<\/code>operaci\u00f3n y eso nos impide buscar correctamente los t\u00edtulos, extractos, contenidos y metadatos de las publicaciones; sin embargo, la consulta debe actualizarse para que utilice una <code>OR<\/code>operaci\u00f3n.<\/p>\n<p>Literalmente, esto significa que se ver\u00e1 en el t\u00edtulo, el contenido, el extracto o los metadatos.<\/p>\n<p>Opt\u00e9 por usar una expresi\u00f3n regular en mi implementaci\u00f3n, pero su implementaci\u00f3n puede funcionar reemplazando subcadenas. Por lo tanto, hay un poco de comentario para <a href=\"https:\/\/gist.github.com\/tommcfarlin\/4f2fa607bf002f52a7a8d1e08f75d86a#file-01-posts-where-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">brindarle la mayor flexibilidad<\/a>.<\/p>\n<pre><code>&lt;?php\nadd_filter( 'posts_where', function($where, $query) {\n\n    \/\/ Determine if 'headline_notes' appears in the WHERE clause.\n    $position = strpos($where, 'acme_meta_key');\n    if (false === $position) {\n        return $where;\n    }\n\n    \/\/ Look for the 'AND' clasue and replace it with 'OR' in the WHERE clause.\n    $regularExpress = '\/\/mi'; \/\/ Your regular expression.\n    $replacement = ''; \/\/ Your string to replace.\n\n    return preg_replace(\n        $regularExpression,\n        $replacement,\n        $where\n    );\n}, 10, 2);<\/code><\/pre>\n<p>Esto actualiza la <code>WHERE<\/code>cl\u00e1usula que se activa para completar el conjunto de trabajo en la parte inicial del art\u00edculo donde agregamos metadatos.<\/p>\n<h2>Hay otras formas<\/h2>\n<p>Tenga en cuenta que hay algunas formas incre\u00edblemente flexibles de trabajar con WP_Query para obtener los resultados que necesita. Y su implementaci\u00f3n variar\u00e1 seg\u00fan lo que est\u00e9 haciendo.<\/p>\n<p>As\u00ed que considere esta una de las muchas formas que se pueden usar; sin embargo, sepa que si tiene:<\/p>\n<ol>\n<li>una sola llave,<\/li>\n<li>un valor (o un valor que se puede dividir en una matriz),<\/li>\n<li>y desea buscar metadatos junto con el contenido de publicaci\u00f3n tradicional<\/li>\n<\/ol>\n<p>Entonces esto funcionar\u00e1.<\/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>Aqu\u00ed se explica c\u00f3mo expandir la b\u00fasqueda para incluir metadatos de publicaciones, tenemos que actualizar la consulta que se ejecuta para que incorpore las tablas de metadatos de publicaciones.<\/p>\n","protected":false},"author":1,"featured_media":236453,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,831,914,800,840,861],"tags":[1172],"class_list":["post-231477","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-guia-para-principiantes","category-otro","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231477","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=231477"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231477\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236453"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}