Intereting Posts
Как я могу сделать доступным для всего сайта контент, например нижний колонтитул Скрыть редактор с определенным значением метаданных Оператор JavaScript && в визуальном редакторе Не показывать html, если пользовательское поле пуст Как добавить поиск по автору в поиск по умолчанию WordPress по умолчанию? Возможность синхронизировать и точно одинаковые множественные сайты через WordPress Multisite Базовые множественные циклы отображают только первый цикл Как удалить страницы автора? WordPress / Server выводит странный результат Клиент не может видеть обновленный динамический контент Передача строки meta_box в post__in? Проблема с загрузкой метаданных Проблема в замене__состояния на_excerpt () Почему необходимо предотвратить прямой доступ к включенным файлам? Определить WP_DEBUG условно / только для ошибок admins / log (добавить аргумент arg для всех ссылок?)

Как эхо массив, возвращаемый функцией

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

Вот код

<?php echo do_shortcode('[su_accordion]' . hsj_accordion($slugs) . '[/su_accordion]'); ?> <?php function hsj_accordion($slugs) { foreach($slugs as $slug ) { echo do_shortcode('[su_spoiler title="' . $slug . '"]' . hsj_product_list($slug) . '[/su_spoiler]'); } } ?> <?php function hsj_product_list( $slug ) { $args = array( 'post_type' => 'product', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $slug ) ) ); $products = get_posts( $args ); $product_list[] = array(); foreach( $products as $post ) { $product = wc_get_product( $post ); echo $product->get_title(); } } ?> 

Вы не можете вернуть массив из короткого кода, это приведет к следующей ошибке

Преобразование массива в строку …..

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

Чтобы правильно создать короткий код из вашей функции, вы должны сделать что-то вроде этого: ( CAVEAT: Utested и только демо для работы )

 add_shortcode( 'my_shortcode', 'hsj_product_list' ); function hsj_product_list( $atts ) { $attributes = shortcode_atts( array( 'slug' => '', ), $atts, 'my_shortcode' ); $args = array( 'post_type' => 'product', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $attributes['slug'] ) ) ); $products = get_posts( $args ); $output = ''; if ( $products ) { foreach( $products as $post ) { $product = wc_get_product( $post ); $output .= $product->get_title(); } } return $output; } 

Как вы можете видеть, я объединил все значения, которые мне нужны, в одну строку, которая задана переменной $output . Я также удостоверился, что нет сообщения о том, что мы выводим пустую строку, определяя $output = '' прежде чем мы начнем цикл foreach

Вы можете использовать его, как следует

 [my_shortcode slug='my-slug'] 

НЕПРАВИЛЬНЫЕ ПРИМЕЧАНИЯ

  • Вы хотели бы санировать и проверять пользовательские входы, в этом случае значение, переданное в slug

  • IMO, если вы собираетесь использовать do_shortcode , тогда вам не нужен do_shortcode . Просто используйте функцию и внесите необходимые изменения в функцию. Это будет быстрее, так как короткие коды нужно разобрать и проанализировать, прежде всего, сделать их медленнее, чем просто самопонимающие функции

  • Всегда проверяйте, что у вас есть значение массива, прежде чем передавать его в цикл foreach . Если пустое значение передано, это приведет к предупреждению PHP (ошибка). Я уже сделал это в своем коде выше, поэтому не забудьте проверить его

  • Вышесказанное является всего лишь основами короткого кода, вы должны расширять и изменять и злоупотреблять им, как вы сочтете нужным, чтобы удовлетворить ваши потребности