¿Cómo se puede mejorar esta función rudimentaria?

25 ene 2011, 06:45:58
Vistas: 148
Votos: 0

En la primera función a continuación, dentro del foreach, estoy llamando a la segunda función para probar la ocurrencia de IDs de categoría coincidentes que quiero eliminar de la lista de categorías.

Sin embargo, la forma en que lo estoy haciendo en la segunda función me parece bastante rudimentaria, por falta de un término mejor. ¿Cómo podría mejorar esta búsqueda?

function admin_trim_category_description( $terms, $taxonomies )
{
    if( 'category' != $taxonomies[0] )return $terms;

    foreach( $terms as $key=>$term ) 
        { 
        $terms[$key]->description = strip_tags(substr( $term->description, 0, 75 ))."..."; 
        if(ce4_get_utility_cats($terms[$key]->term_id))
            {
            unset($terms[$key]);
            }
        } 
        return $terms;
}

function  ce4_get_utility_cats($cat_id)
{
    if($cat_id == get_cat_ID('category1') OR $cat_id == get_cat_ID('hidden') OR $cat_id == get_cat_ID('category2') OR $cat_id == get_cat_ID('category3'))
        {
        return true;
        }
        else
        {
        return false;
        }
}

EDITADO: Las funciones anteriores se llaman de la siguiente manera...

add_action( 'admin_head-edit-tags.php', 'admin_edit_tags' );
function admin_edit_tags(){
    add_filter( 'get_terms', 'admin_trim_category_description', 10, 2 );
    }
3
Comentarios

¿Desde dónde estás llamando a admin_trim_category_description()? ¿Cuál es tu contexto y caso de uso? También, ¿qué contiene $terms?

MikeSchinkel MikeSchinkel
25 ene 2011 07:20:47

Y aquí hay una buena lista de funciones de arrays en PHP: http://www.w3schools.com/php/php_ref_array.asp

hakre hakre
25 ene 2011 07:23:58

@Mike: Buen punto, he actualizado mi pregunta para proporcionar el contexto

Scott B Scott B
25 ene 2011 17:38:12
Todas las respuestas a la pregunta 3
1
/**
 * Función para recortar la descripción de categorías en el área de administración
 * y filtrar categorías específicas
 */
function admin_trim_category_description( $terms, $taxonomies ){
  // Verificar si estamos trabajando con la taxonomía 'category'
  if( 'category' != $taxonomies[0] ) return $terms;
  
  // Lista de categorías que queremos excluir
  $categorias_excluidas = array('category1', 'oculto', 'category2', 'category3');

  // Recorrer todos los términos (categorías)
  foreach( $terms as $key => $term) {
    // Si la categoría no está en la lista de excluidas
    if(!in_array($terms[$key]->name, $categorias_excluidas)) {
      // Recortar la descripción a 75 caracteres y eliminar etiquetas HTML
      $terms[$key]->description = strip_tags(substr( $term->description, 0, 75 ))."...";
    } else {
      // Eliminar la categoría completamente si está en la lista de excluidas
      unset($terms[$key]);
    }
  }

  return $terms;
}
25 ene 2011 07:19:02
Comentarios

+1 Funciona genial. Sabía que había una mejor manera :) in_array será útil en el futuro.

Scott B Scott B
25 ene 2011 17:44:52
0

Lo único que puedo ver que es evidentemente ineficiente es el hecho de que llames a get_cat_ID para cada categoría en cada término. Eso es una consulta a la base de datos por cada llamada a la función.

Sería más eficiente llamar a esas funciones antes del foreach y colocarlas en un array enviado como parámetro a la función.

25 ene 2011 07:20:22
0

Quizás podrías intentar agregar los términos que estás verificando en un array, y luego simplemente verificar si el $cat_id está en el array. Quiero decir que existen funciones similares a eso, pero no las recuerdo en este momento. Esto eliminaría la necesidad de los OR's

25 ene 2011 07:22:13