{"id":228992,"date":"2022-11-01T13:56:00","date_gmt":"2022-11-01T10:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228992"},"modified":"2022-11-09T05:06:11","modified_gmt":"2022-11-09T02:06:11","slug":"filtrado-adecuado-del-contenido-de-las-publicaciones-y-comprension-de-apply_filters","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/filtrado-adecuado-del-contenido-de-las-publicaciones-y-comprension-de-apply_filters\/","title":{"rendered":"Filtrado adecuado del contenido de las publicaciones (y comprensi\u00f3n de apply_filters)"},"content":{"rendered":"\n<p>De vez en cuando, cada vez que estoy trabajando con un c\u00f3digo fuente preexistente o realizando una auditor\u00eda de c\u00f3digo, veo a otros modificando el contenido de la publicaci\u00f3n de un objeto de publicaci\u00f3n <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-00-my_content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como este<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$post-&gt;post_content = $my_content;\n<\/code><\/pre>\n<p>En este punto, algunos aparecer\u00e1n e inmediatamente dir\u00e1n que lo est\u00e1s haciendo mal. Odio esa frase (e incluso est\u00e1 llena de basura en el c\u00f3digo base de WordPress, pero estoy divagando).<\/p>\n<p>Hay formas de usar otras funciones de la API de WordPress existentes para desinfectar los datos antes de configurarlos como el valor del atributo <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Post\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">post_content<\/a>, usar esas funciones no es la mejor manera de hacerlo.<\/p>\n<p>En cambio, todos deber\u00edamos usar apply_filters. \u00bfEl problema? Algunos no saben, otros no saben c\u00f3mo funciona y otros no saben c\u00f3mo usarlo. Es decir, no est\u00e1 claro c\u00f3mo filtrar correctamente el contenido de las publicaciones.<\/p>\n<p>Contenido sin procesar filtrado por WordPress y luego escrito en la base de datos.<\/p>\n<p>Pero para aquellos que pueden caer en cualquiera de las categor\u00edas anteriores, quiz\u00e1s esto pueda ayudar.<\/p>\n<h2>Filtrado adecuado del contenido de la publicaci\u00f3n<\/h2>\n<p>En este punto, asumo que conoce <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Post<\/a>, sus propiedades y c\u00f3mo modificarlas a trav\u00e9s de varias funciones API.<\/p>\n<p>El problema principal al que me refiero es asegurarme de que el contenido que se escribir\u00e1 en la base de datos tenga el mismo formato que lo har\u00eda WordPress si escribiera o actualizara una publicaci\u00f3n.<\/p>\n<p>Y la forma en que sucede <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-03-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">es as\u00ed<\/a> (y pronto llegaremos a los detalles):<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = apply_filters( 'the_content', $new_content );\n<\/code><\/pre>\n<p>Pero las preguntas sobre qu\u00e9 hace esta funci\u00f3n, c\u00f3mo funciona y cu\u00e1ndo usarla permanecen.<\/p>\n<h3>\u00bfQu\u00e9 es apply_filters?<\/h3>\n<p>Claro, puedes leer todo sobre esto en los Recursos para desarrolladores, y da <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta definici\u00f3n<\/a> :<\/p>\n<blockquote>\n<p>Llame a las funciones agregadas a un enlace de filtro.<\/p>\n<\/blockquote>\n<p>Pero eso no siempre ayuda. Quiero decir que podemos leer la documentaci\u00f3n y seguir confundidos, \u00bfverdad?<\/p>\n<p>Piensa en ello de esta manera:<\/p>\n<ol>\n<li>Un filtro es una funci\u00f3n que acepta entradas para procesar.<\/li>\n<li>La entrada se procesa en funci\u00f3n de la definici\u00f3n de la funci\u00f3n.<\/li>\n<li>A continuaci\u00f3n, la funci\u00f3n devuelve el valor procesado.<\/li>\n<\/ol>\n<p>Lo que haga con el valor devuelto depende de usted, pero cuando aplica un filtro o llama a <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">apply_filters<\/a> a una parte de la informaci\u00f3n, le est\u00e1 diciendo a WordPress: &quot;Tengo esta informaci\u00f3n, aplique el filtro identificado por esta clave y entregue el resultado de vuelta a m\u00ed &quot;.<\/p>\n<p>No est\u00e1 mal, \u00bfverdad?<\/p>\n<h3>\u00bfComo funciona?<\/h3>\n<p>Pero hay una parte de lo anterior que lleva a una pregunta. Espec\u00edficamente, menciono que \u00ab\u2026por favor aplique el filtro identificado por esta clave\u2026&quot; y la idea de una clave puede ser confusa, especialmente porque un filtro o una acci\u00f3n o, en t\u00e9rminos m\u00e1s generales, un gancho puede identificarse por lo que se llama una etiqueta o un llave.<\/p>\n<p>son sinonimos Entonces, cuando vea una <strong>etiqueta<\/strong> o <strong>una clave<\/strong> en el contexto de un gancho, tr\u00e1telos como tales.<\/p>\n<p>Dicho esto, as\u00ed es como funciona:<\/p>\n<ol>\n<li>La funci\u00f3n apply_filters acepta dos argumentos. La primera es la etiqueta o la clave (seg\u00fan como quieras llamarla) asociada al filtro (l\u00e9ase: funci\u00f3n) que quieres usar para procesar el trabajo, la segunda es el valor que quieres procesar dentro de dicha funci\u00f3n.<\/li>\n<li>El filtro se activar\u00e1 y devolver\u00e1 un resultado (o, recuerde, la funci\u00f3n que hemos definido).<\/li>\n<li>Luego tomamos el valor devuelto y lo aplicamos a cualquier propiedad que queramos.<\/li>\n<\/ol>\n<p>Entonces, por ejemplo, es probable que veas algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-01-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como esto<\/a> en el c\u00f3digo base de otra persona (o quiz\u00e1s incluso en el tuyo):<\/p>\n<pre><code>&lt;?php\n\n$post-&gt;post_content = apply_filters( 'the_content', $my_content );\n<\/code><\/pre>\n<p>Y ahora que tienes un poco de contexto sobre c\u00f3mo funciona, entiendes la idea, \u00bfverdad?<\/p>\n<h3>\u00bfC\u00f3mo lo usamos?<\/h3>\n<p>Esto lleva el c\u00edrculo completo de la publicaci\u00f3n a la pregunta inicial de c\u00f3mo podemos usar apply_filters para post_content siempre que necesitemos insertar o actualizar una publicaci\u00f3n.<\/p>\n<p>Entonces, digamos que tiene el contenido que desea aplicar (o agregar) al valor del contenido de una publicaci\u00f3n. Podr\u00edas hacer algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-02-dont-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como esto<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = $new_content;\n<\/code><\/pre>\n<p>Pero eso es de mala forma. En su lugar, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-03-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">haces esto<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = apply_filters( 'the_content', $new_content );\n<\/code><\/pre>\n<p>Y as\u00ed es como WordPress lo hace.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Entonces, dada toda la informaci\u00f3n y el c\u00f3digo anterior, debe estar bien preparado no solo para asegurarse de que est\u00e1 filtrando correctamente los datos que se insertar\u00e1n en la base de datos, sino que tiene el conocimiento necesario para definir sus filtros y aplicarlos a cualquier dato que creas conveniente.<\/p>\n<p>Pero los ejemplos de eso son contenido para otra publicaci\u00f3n.<\/p>\n<p>Mientras tanto, si est\u00e1 trabajando con contenido de publicaci\u00f3n, aseg\u00farese de filtrar correctamente los datos antes de colocarlos en la base de datos.<\/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>Si est\u00e1 insertando o actualizando publicaciones mediante programaci\u00f3n, es importante asegurarse de que est\u00e1 filtrando correctamente el contenido de la publicaci\u00f3n.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,810,716,800,861],"tags":[1172],"class_list":["post-228992","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-complementos","category-desarrollador","category-php-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228992","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=228992"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228992\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=228992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=228992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=228992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}