¿Documentación de filtros de wordpress? Tratando de entender add_filter()

5 minutos de lectura

Leí la documentación varias veces y he tenido dificultades para tratar de averiguar qué está pasando con la función. Estoy cada vez más confundido después de mirar la documentación, también mirando el código fuente.

add_filter($tag, $hook, $priority, $args);

me parece que la nueva función extiende la función principal. Lo que me desconcierta es qué partes del gancho se anulan. en algunos ejemplos en la documentación, veo que algunas variables se reemplazan con $args en su nueva $etiqueta.

Casi lo entendí todo aquí: http://www.andrewnacin.com/2010/05/18/repensando-template-tags-in-plugins/

pero luego no pude entender cómo pasas los argumentos y cuáles eventualmente se anulan.

gracias de antemano.

  • Creo que tut solo es más confuso si ya tienes problemas para entender los filtros y las acciones. ¿Puedes explicar el contexto en el que estás tratando de usarlos? Entonces podemos responder más específicamente a sus necesidades, en lugar de simplemente repetir el Codex.

    – El médico muerto

    6 de junio de 2010 a las 12:11

add_filter() es una función complementaria de apply_filters(). Antes apply_filters se ejecuta para un determinado filtro (el $tag argumento en add_filter()), puedes usar add_filter para registrar un filtro para una etiqueta. Cuando apply_filters() se ejecuta con ese nombre de etiqueta, llama a todos los filtros registrados en orden. Los filtros se utilizan para pasar datos a través de funciones para su manipulación. Por ejemplo, uno que a menudo uso es el filtro wp_list_pages. Lo uso para eliminar saltos de línea de la lista de páginas. Así es como funciona:

Primero defino una función que toma un parámetro y lo devuelve después de trabajar con él:

function my_list_pages_filter($pages){
  $pages = preg_replace( array("\n","\r"), '', $pages );
  return $pages;
}

Luego agrego el gancho de filtro: add_filter(‘wp_list_pages’, ‘my_list_pages_filter’);

add_filter le dice a WordPress “Cuando la función apply_filters se llama con el primer argumento ‘wp_list_pages’, llame my_list_pages_filter.” Los filtros deben enviar al menos un valor (de cualquier tipo: cadena, matriz, entero, etc.) y esperan que la función devuelva un valor.

Le brindan una forma de manipular la entrada antes de devolverla.

do_action es un gancho completamente diferente. Para enviar información a su función de filtro, haga lo siguiente (tomado de su ejemplo):

<div id="content" <?php $class="post post_content"; echo apply_filters('my_custom_classes', $class); ?>>

Y luego en su archivo functions.php, agregue esto:

add_filter('my_custom_classes','my_custom_classes_function');
function my_custom_classes_function($classes){
  $output 'class="'. $classes.'"';
  return $output;
}

Es un uso bastante rudimentario de los filtros, pero es un comienzo. Realmente puedes hacerte una idea de lo que puedes hacer con los filtros con el mismo ejemplo con algunas mejoras:

function my_custom_classes_function($classes){
  $classes = explode( ' ', $classes );
  if(is_home())
    $classes[] = 'home_content';
  if(is_single())
    $classes[] = 'single_content';
  if(is_page())
    $classes[] = 'page_content';
  if(is_tag())
    $classes[] = 'tag_content';
  $output 'class="'. implode( ' ', $classes ) .'"';
  return $output;
}

Chris, pareces estar confundido por algunas cosas:

  1. Los filtros y las acciones no están relacionados (ambos son un tipo de lo que WP llama un “gancho”, pero por lo demás no están relacionados). Arriba dijiste “con mi filtro…” pero do_action() es para Acciones no Filtros.
  2. La etiqueta (es decir, el parámetro de etiqueta para agregar_filtro, aplicar_filtro, agregar_acción, hacer_acción no tiene nada que ver con las etiquetas en el sentido XML/HTML (quizás lo sepa).
  3. Al invocar una acción, al usar do_action() probablemente desee pasar un argumento además del nombre de la etiqueta obligatoria. Arriba llamó a do_action(‘content_class’), que, en primer lugar, no tendrá ningún efecto a menos que primero haya registrado una Acción con el nombre de etiqueta “content_class”, y en segundo lugar, en su función de acción content_class_filter (que sería mejor llamarlo content_class_action como no tiene nada que ver con los filtros), tiene un parámetro opcional $classes, que siempre será ” ya que no proporcionaste un argumento para do_action después del nombre de la etiqueta. Tenga en cuenta que también probablemente quiso escribir $output = ..
  4. Los filtros no “anulan” nada (especialmente en el sentido del lenguaje OO). Si agrega varios filtros con la misma etiqueta, se llamará a todos ellos cuando se llame a apply_filters para la etiqueta. Puede controlar el orden mediante el parámetro de prioridad. Lo mismo ocurre con las acciones.

avatar de usuario
Milo

es un artículo muy bonito, pero debo cometer algún error estúpido, sin embargo….

Estoy tratando de eliminar algunos elementos en el menú de navegación WP3+ en “Opciones de pantalla” a través de esta técnica “add_filter”:

wp-admin/includes/nav-menus.php:

function wp_nav_menu_manage_columns() {
    return array(
        '_title' => __('Show advanced menu properties'),
        'cb' => '<input type="checkbox" />',
        'link-target' => __('Link Target'),
        'css-classes' => __('CSS Classes'),
        'xfn' => __('Link Relationship (XFN)'),
        'description' => __('Description'),
    );
}

tema/funcion.php:

Parece que las funciones originales no son parte de alguna CLASE:

add_filter('wp_nav_menu_manage_columns', 'new_wp_nav_menu_manage_columns');
function new_wp_nav_menu_manage_columns() {
    return array(
        '_title' => __('Show advanced menu properties'),
        'cb' => '<input type="checkbox" />',
        'link-target' => __('Link Target'),
    );
}

Pero como resultado, puedo ver las “Opciones de pantalla” originales con todos los elementos. Si elimino las líneas: ‘css-classes’ => _(‘Clases CSS’), ‘xfn’ => _(‘Relación de enlace (XFN)’), ‘descripción’ => __(‘Descripción’), directamente en el núcleo de WP, todo se ve bien, por lo que no estoy seguro de que sea posible anular todas las funciones de WP de esta manera.

Muchas gracias por tu consejo. Saludos cordiales Milo

He colocado gancho aquí en el archivo de plantilla:

<div id="content" <?php content_class() ?>>

el gancho simplemente se autoejecuta en el archivo de funciones:

function content_class() {
 do_action('content_class');
}

con mi filtro estoy tratando de pasar clases a esta función.

function content_class_filter($classes="") {
   $output 'classes="'. $classes.'"';
   return $output;
}

luego, finalmente, estoy realmente confundido sobre cómo escribir el filtro …

¿Ha sido útil esta solución?