Можно ли по-другому записать код в шорткоде?

Создал шорткод на сайте и добавил его через wpbackery page builder на главную страницу. Вопрос в том, что можно ли как-то более удобно и корректно записать HTML и PHP код в функции? Еще слышал, что лучше в шорткоде использовать return вместо echo, но тогда шорткод вовсе не выводится таким образом и т.к. я в php не силен, может подскажете как правильно записать?

function tags() {
            $tags = get_field_object('метки_и_ссылки', get_queried_object());
            echo "<div class='theme-container tag-container'><ul class='tag-links'>";
            foreach( $tags['value'] as $tag['value'] ) {
               echo "<a class='tag-link' href='";
               echo $tag['value'] -> description;
               echo "'>";
               echo $tag['value'] -> name;
               echo "</a>";
            }
            echo "</ul></div>";
         }
         add_shortcode('tagsAndLinks', 'tags');
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
Note that the function called by the shortcode should never produce an output of any kind. Shortcode functions should return the text that is to be used to replace the shortcode. Producing the output directly will lead to unexpected results. This is similar to the way filter functions should behave, in that they should not produce unexpected side effects from the call since you cannot control when and where they are called from.

https://developer.wordpress.org/reference/function...
Ответ написан
artzolin
@artzolin
php, WordPress разработка сайтов zolin.digital
Сделал опрятнее и дам несколько советов

  1. Для вывода тегов в ядре есть функции the_tags(), get_the_tag_list() и get_the_term_list()
  2. Вы можете определить список атрибутов $atts, чтобы сделать шорткод более универсальным
  3. Нужно проверять, что переменная $post определена, get_queried_object() не сработает для главной, архивов и некоторых других шаблонов
  4. Шорткод ВСЕГДА должен возвращать return, а не делать вывод echo
  5. Если функция возвращает данные, то хорошо поставить apply_filters(), это сэкономит вам кучу времени и нервов, если понадобится поменять возвращаемые данные с помощью фильтра add_filter()
  6. В тег <ul> можно вкладывать только элементы <li>


// Использование [tag-list field="метки_и_ссылки" class="tag-list"]
add_shortcode( 'tag-list', 'get_custom_tag_list' );
function get_custom_tag_list( $atts ) {

	// белый список параметров и значения по умолчанию для шорткода
	$atts = shortcode_atts( array(
		'class' => 'list',
		'field' => '',
		'post_id' => 0
	), $atts );

	$output = '';
	$post = get_post( $atts['post_id'] );

	if ( isset( $post->ID ) && !empty($atts['field']) ) {
		$tags = get_field_object( $atts['field'], $post->ID );
		if ( $tags ) {
			$output .= '<ul class="' . $atts['class'] . '">';
			foreach ( $tags['value'] as $key => $value ) {
				$output .= '<li class="' . $atts['class'] . '__item" >';
					$output .= '<a class="' . $atts['class'] . '__link" href="' . $value->description . '" rel="tag">' . $value->name . '</a>';
				$output .= '</li>';
			}
			$output .= '</ul>';
		}
	}

	return apply_filters( 'get_custom_tag_list', $output );
	
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы