Как можно улучшить эту простую функцию?

25 янв. 2011 г., 06:45:58
Просмотры: 148
Голосов: 0

В первой функции ниже, внутри foreach, я вызываю вторую функцию для проверки совпадения ID категорий, которые нужно удалить из списка категорий.

Однако способ, которым я это делаю во второй функции, кажется мне довольно примитивным. Как можно улучшить эту проверку?

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;
        }
}

РЕДАКТИРОВАНИЕ: Вышеуказанные функции вызываются следующим образом...

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
Комментарии

Откуда вы вызываете admin_trim_category_description()? Какой у вас контекст и сценарий использования? Также, что содержит $terms?

MikeSchinkel MikeSchinkel
25 янв. 2011 г. 07:20:47

И это хороший список функций для работы с массивами в PHP: http://www.w3schools.com/php/php_ref_array.asp

hakre hakre
25 янв. 2011 г. 07:23:58

@Mike: Хорошее замечание, я обновил свой вопрос, чтобы предоставить контекст

Scott B Scott B
25 янв. 2011 г. 17:38:12
Все ответы на вопрос 3
1
function admin_trim_category_description( $terms, $taxonomies ){
  if( 'category' != $taxonomies[0] )return $terms;
  $whatever_categories = array('category1', 'hidden', 'category2', 'category3');

  foreach( $terms as $key => $term)
    if(!in_array($terms[$key]->name, $whatever_categories)) $terms[$key]->description = strip_tags(substr( $term->description, 0, 75 ))."...";
    else unset($terms[$key]);


  return $terms;
}
25 янв. 2011 г. 07:19:02
Комментарии

+1 Работает отлично. Я знал, что есть лучший способ :) in_array пригодится в будущем.

Scott B Scott B
25 янв. 2011 г. 17:44:52
0

Единственное, что бросается в глаза как явно неэффективное — это вызов get_cat_ID для каждой категории каждого термина. Каждый такой вызов означает запрос к базе данных.

Более эффективным решением будет вызов этих функций до цикла foreach и помещение результатов в массив, который затем передается как параметр в функцию.

25 янв. 2011 г. 07:20:22
0

Возможно, стоит попробовать добавить проверяемые термины в массив, а затем просто проверять, находится ли $cat_id в этом массиве. Кажется, есть похожие функции для этого, но я не могу сейчас вспомнить их названия. Это позволит избавиться от множества условий OR.

25 янв. 2011 г. 07:22:13