Создание шорткода для отображения произвольных типов записей с определенной таксономией
Я создал шаблон страницы для вывода всех продуктов определенной продуктовой линейки. Теперь я хочу вывести все записи этого пользовательского типа записей (продукты) на основе таксономии, указанной в шорткоде для каждой страницы.
Пример:
Страница "Список всех продуктов Prime"
[products line="prime"]
Я попробовал следующий код:
function shortcode_mostra_produtos ( $atts ) {
$atts = shortcode_atts( array(
'default' => ''
), $atts );
$terms = get_terms('linhas'); // получить термины
wp_reset_query();
$args = array('post_type' => 'produtos', // тип записи продукты
'tax_query' => array(
array(
'taxonomy' => 'linhas', // таксономия линий
'field' => 'slug', // поле слаг
'terms' => $atts, // переданные атрибуты
),
),
);
$loop = new WP_Query($args);
if($loop->have_posts()) {
while($loop->have_posts()) : $loop->the_post();
echo ' "'.get_the_title().'" '; // вывод заголовка
endwhile;
}
}
add_shortcode( 'produtos','shortcode_mostra_produtos' );
Прежде всего, всегда лучше регистрировать шорткоды во время события init
, а не просто в общем файле functions.php
. По крайней мере, add_shortcode()
должен быть в init
. В любом случае, давайте начнем!
Когда вы используете add_shortcode()
, первый параметр будет именем шорткода, а второй — callback-функцией. Это означает, что:
[products line="prime"]
Должно быть заменено на:
[produtos line="prime"]
Пока у нас есть это:
/**
* Регистрация всех шорткодов
*
* @return null
*/
function register_shortcodes() {
add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );
/**
* Callback-функция для шорткода Produtos
* - [produtos]
*
* @param Array $atts
*
* @return string
*/
function shortcode_mostra_produtos( $atts ) {
/** Здесь будет наш план
}
Давайте рассмотрим обработку атрибутов. Функция shortcode_atts()
работает так, что она пытается сопоставить атрибуты, переданные в шорткод, с атрибутами в переданном массиве, где левая сторона — это ключ, а правая — значения по умолчанию. Поэтому нам нужно изменить defaults
на line
— если мы хотим установить категорию по умолчанию, это можно сделать здесь:
$atts = shortcode_atts( array(
'line' => ''
), $atts );
ЕСЛИ пользователь добавит атрибут к шорткоду line="test"
, то наш индекс массива line
будет содержать test
:
echo $atts['line']; // Выведет 'test'
Все остальные атрибуты будут проигнорированы, если мы не добавим их в массив shortcode_atts()
. В конце остается только WP_Query и вывод того, что вам нужно:
/**
* Регистрация всех шорткодов
*
* @return null
*/
function register_shortcodes() {
add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );
/**
* Callback-функция для шорткода Produtos
*
* @param Array $atts
*
* @return string
*/
function shortcode_mostra_produtos( $atts ) {
global $wp_query,
$post;
$atts = shortcode_atts( array(
'line' => ''
), $atts );
$loop = new WP_Query( array(
'posts_per_page' => 200,
'post_type' => 'produtos',
'orderby' => 'menu_order title',
'order' => 'ASC',
'tax_query' => array( array(
'taxonomy' => 'linhas',
'field' => 'slug',
'terms' => array( sanitize_title( $atts['line'] ) )
) )
) );
if( ! $loop->have_posts() ) {
return false;
}
while( $loop->have_posts() ) {
$loop->the_post();
echo the_title();
}
wp_reset_postdata();
}

add_shortcode( 'product-list','bpo_product_list' );
function bpo_product_list ( $atts ) {
$atts = shortcode_atts( array(
'category' => ''
), $atts );
$terms = get_terms('product_category');
wp_reset_query();
$args = array('post_type' => 'product',
'tax_query' => array(
array(
'taxonomy' => 'product_category',
'field' => 'slug',
'terms' => $atts,
),
),
);
$loop = new WP_Query($args);
if($loop->have_posts()) {
while($loop->have_posts()) : $loop->the_post();
echo ' "'.get_the_title().'" ';
endwhile;
}
else {
echo 'Извините, записи не найдены';
}
}
В приведенном выше коде я создал пользовательский тип записей "product" и таксономию "product_category" для этого типа записей.
[product-list category="shirts"]
Данный код работает идеально!

Попробуйте этот код
function shortcode_bws_quiz_maker($id)
{
if($id!='')
{
$post_id=$id[0];
$html='';
global $wpdb;
$args=array('post_type'=>'post_type','p'=>$post_id);
$wp_posts=new WP_Query($args);
$posts=$wp_posts->posts;
$html.="Напишите здесь, что вы хотите получить";
return $html;
}
else
{
return 'Пожалуйста, введите правильный шорткод';
}
}
add_shortcode('bws_quiz_maker','shortcode_bws_quiz_maker');

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему?
