2010-06-06 8 views
8

He leído la documentación varias veces y he estado teniendo dificultades para tratar de averiguar qué está pasando con la función. Cada vez estoy más confundido después de mirar la documentación, mirando también el código fuente.documentación de filtros wordpress? Tratando de entender add_filter()

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

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

casi entendí todo aquí: http://www.andrewnacin.com/2010/05/18/rethinking-template-tags-in-plugins/

pero luego no pude encontrar la manera de pasar argumentos y que con el tiempo te anulado.

gracias de antemano.

+0

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

Respuesta

12

add_filter() es una función que acompaña a apply_filters(). Antes de ejecutar apply_filters para un determinado filtro (el argumento $tag en add_filter()), puede 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 la manipulación. Por ejemplo, uno que a menudo me encuentro usando es el filtro wp_list_pages. Lo uso para eliminar saltos de línea de la lista de páginas. Así que aquí es como funciona:

Primero definir 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 agregar el gancho filtro: add_filter ('wp_list_pages', 'my_list_pages_filter ');

add_filter dice a WordPress "Cuando se llama a la función apply_filters con el primer argumento siendo 'wp_list_pages', llame al 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.

Proporcionan una forma de manipular la entrada antes de devolverla.

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

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

Y luego en sus funciones.archivo PHP, añadir lo siguiente:

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

Eso es un uso bastante rudimentario de filtros, pero es un comienzo. Realmente se puede tener una idea de lo que puede 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; 
} 
+0

Wow gracias. Has hecho que sea más fácil de entender. – chrisjlee

0

he colocado el gancho aquí en el archivo de plantilla:

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

el gancho solo auto ejecuta en el archivo de funciones:

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

con mi filtro que estoy tratando de pasar las clases a este función.

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

, finalmente, estoy realmente confundido en cuanto a la forma de escribir el filtro ...

2

es muy buen artículo, pero hay que hacer algo estúpido error, sin embargo ....

estoy tratando de eliminar algunos elementos de menú WP3 + Navegación en "Opciones de energía" 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'), 
    ); 
} 

mytheme/function.php:

Parece que las funciones originales no es una 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 que se puede ver el original "Opciones de energía" con todos los elementos. Si quito las líneas: 'CSS-clases' => _ ('clases CSS'), 'XFN' => _ ('Enlace Relación (XFN)'), 'description' => __ ('Descripción'), directamente en el núcleo de WP, todo parece estar bien, así que no estoy seguro de que sea posible anular todas las funciones de WP de esta manera.

Muchas gracias por su consejo. Con recuerdos, Milo

4

Chris, Usted parece ser confundido por un par de cosas:

  1. Filtros y acciones no están relacionados (los dos son un tipo de lo WP llama un 'gancho' , pero por lo demás sin relación). Arriba de ti dijiste "con mi filtro ..." pero do_action() es para Acciones no Filtros.
  2. La etiqueta (es decir, el parámetro etiqueta para add_filter, apply_filter, add_action, do_action no tienen nada que ver con las etiquetas en el sentido de XML/HTML (-. Tal vez usted sabe que)
  3. Cuando se invoca una acción, utilizando do_action (usted) probablemente desee pasar un argumento además del nombre obligatorio de la etiqueta. Por encima de usted, llamó a do_action ('clase_contenido'), que, en primer lugar, no tendrá efecto a menos que haya registrado una Acción con el nombre de etiqueta "clase_contenido", y en segundo lugar , en su función de acción content_class_filter (que sería mejor llamar a content_class_action ya que no tiene nada que ver con los filtros), tiene un parámetro opcional $ classes, que siempre será '' ya que no proporcionó un argumento para do_action después del nombre de la etiqueta Tenga en cuenta también que probablemente pensó escribir $ output = ..
  4. Los filtros no "anulan" nada (especialmente en el sentido del lenguaje OO). Si se agregan varios filtros con la misma etiqueta, se llamarán a todos cuando se invoque apply_filters para la etiqueta. Puede controlar el orden utilizando el parámetro de prioridad. Lo mismo aplica para Acciones.
+0

Buenos puntos allí. Lo aprecio. – chrisjlee

Cuestiones relacionadas