it-swarm.com.ru

Как вывести пользовательские теги WordPress через запятую?

На основе нескольких ссылок я создал функцию для вывода списка пользовательских терминов таксономии, разделенных запятой. Код работает как задумано, где food_tag - это пользовательская таксономия, которую я зарегистрировал для пользовательского post_type.

Вот функция:

function get_taxonomy_food_tags(){
 $terms = get_terms('food_tag');
 foreach($terms as $term){

 // The $term is an object, so we don't need to specify the $taxonomy.

 $term_link = get_term_link($term);

 $numItems = count($terms);
 $i        = 0;

 // If there was an error, continue to the next term.

 if (is_wp_error($term_link)){
      continue;
 }

 // We successfully got a link. Print it out.

 echo '<a href="' . esc_url($term_link) . '">' . $term->name . '</a>';

 if (++$i != $numItems) {
            echo ', ';
 }

 }
}

Затем я помещаю код <?php get_taxonony_food_tags(); ?> в любое место в шаблонах .php моей темы и получаю список своих пользовательских тегов со ссылкой. такие как:

Ингредиенты: бекон, томатные ломтики, томатный соус, салат, говядина,

Оказывается, последний тег в массиве также напечатан запятой

Как правильно настроить функцию исключения последней запятой?

Заранее спасибо.

1
Adriano Monecchi

У вас есть пара недостатков здесь:

  • ВСЕГДА кодировать таким образом, чтобы ваш код ) потерпеть поражение. Это очень важно. Большинство людей пишут с идеальным мировоззрением. Идеальный мир никогда не случится. Всегда думайте о том, что произойдет, когда ваш код потерпит неудачу.

    Например, в вашем коде $terms возвращает объект объектов term, если все получилось. $terms также возвращает пустой массив, если в таксономии нет терминов или терминов без записей. Он также возвращает объект WP_Error, если таксономия не существует. Это все ошибки. Неверная таксономия вы можете спросить. Если вы правильно зарегистрировали свою таксономию в плагине и отключили этот плагин, ваша таксономия больше не существует, что приведет к ошибке неверной таксономии.

  • Вы должны запустить свой счетчик за пределами цикла foreach. Не внутри

  • Префикс get_ используется для функций, которые возвращают свои выходные данные, а не отражают их.

  • Всегда очищать и проверять

Я перепишу ваш код, чтобы он выглядел примерно так: ( ПРИМЕЧАНИЕ: Требуется PHP5.4 + )

function get_taxonomy_food_tags( $taxonomy = '', $args = [] )
{
    // Check if we have a taxonomy and that it is valid. If not, return false
    if ( !$taxonomy )
        return false;

    // Sanitize the taxonomy input
    $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );

    if ( !taxonomy_exists( $taxonomy ) )
        return false;

    // If we reached this point, our taxonomy is valid. So lets continue. Get our terms
    $terms = get_terms( $taxonomy, $args );

    // We will only check if we have terms, we know our taxonomy is valid because we have reached this point
    if ( empty( $terms ) )
        return false;

    // Great, if we got to this point, we have terms, lets continue
    // Define our variable to hold our term links
    $term_links_array = [];
    foreach ( $terms as $term ) {
        $term_link = get_term_link( $term );

        // Make sure we do not have a WP_Error object, not really necessary, but better be safe
        if ( is_wp_error( $term ) )
            continue;

        // Build an array of term links. Let php do the hard work and calculations
        $term_links_array[] = '<a href="' . esc_url($term_link) . '">' . $term->name . '</a>';
    } // endforeach

    // Make sure that we have an array of term links, if not, return false
    if ( !$term_links_array )
        return false;

    // We have reached this point, lets output our term links
    return implode( ', ', $term_links_array );
}

Теперь вы можете использовать его следующим образом

echo get_taxonomy_food_tags( 'food_tag' );

Я также ввел второй параметр, который можно использовать для передачи массива аргументов во внутреннюю функцию get_terms(), чтобы вы могли использовать новую функцию точно так же, как и функцию get_terms() по умолчанию.

2
Pieter Goosen

Проблема в том, что вы присваиваете значение 0 в качестве значения $ i каждый раз, когда выполняется цикл foreach, поэтому, когда выполняется последний оператор if, каждый раз сравнение равно 1! = 3, и запятая всегда будет печататься. Попробуйте объявить $ i = 0; вне цикла foreach. Как это:

$terms = get_terms('food_tag');
$i = 0;
foreach($terms as $term){ 

//the code here

}

Кроме того, в конце отсутствует фигурная скобка, может быть, это только ошибка вставки копии, но для тех, кто пытается скопировать вставку и запустить ее.

1