Вернуться внутрь foreach внутри шорткода - PullRequest
0 голосов
/ 11 июня 2011

Я использую код PHP ниже для отображения классов CSS, основанных на пользовательских таксономиях, примененных к моим сообщениям WordPress. Моя таксономия называется CC, и ее тремя вариантами являются x, y и z. Для поста, в котором есть все три:

 $cc_terms = get_the_terms($post->ID,'cc');
 foreach ($cc_terms as $term) { 
     echo ' '.$term->slug.'-active'; 
 }

выходы: x-active y-active z-active

Я пытаюсь преобразовать его в функцию шорткода WordPress (где echo не работает, насколько я знаю), и в основном мне нужно выяснить, как захватить cc_class() как одну переменную (не массив) так что это даст мне тот же вывод, что и выше.

function cc_meta($atts, $content = null) {
    global $post;
    extract(shortcode_atts(array('class' => 'default'), $atts));
    function cc_class() {
        $cc_terms = get_the_terms($post->ID, 'cc');
        foreach($cc_terms as $term) {
            return ' '.$term->slug.'-active';
        }
    }
    return '<div class="' . esc_attr($class) . cc_class() . '">...</div>';
}

выходы: <div class="default x-active">...</div>

Это только первый термин, а не все три, что заставляет меня задуматься, как return работает в foreach циклах. Есть идеи, как мне заставить это работать?

желаемый результат: <div class="default x-active y-active z-active">...</div>

Обновление 1 : я попытался с .=, как предложено, и получаю пустую ошибку:

function cc_meta( $atts, $content = null ) {
    global $post;
    extract(shortcode_atts(array('class' => 'default'), $atts));

    $cc_terms = get_the_terms($post->ID, 'cc');
    foreach ($cc_terms as $term) {
        $return .= ' '.$term->slug.'-active';
    }
    return '<div class="' . esc_attr($class) . $return . '">...</div>';
}

Обновление 2 : я удалил строку global $post, и она работает - мило! Спасибо всем =)

function cc_meta($atts, $content = null) {
    extract(shortcode_atts(array('class' => 'default'), $atts));
    $cc_terms = get_the_terms($post->ID, 'cc');
    foreach($cc_terms as $term) { 
        $return .= ' '.$term->slug.'-active';
    }
    return '<div class="' . esc_attr($class) . $return . '">...</div>';
}

1 Ответ

5 голосов
/ 11 июня 2011

Не возвращайте в середине вашей функции, используйте возврат только в конце.

Вместо return используйте это:

$return .= 

и перед закрытием } сделайте return $return;

...