Создание шорткода для отображения произвольных типов записей с определенной таксономией

21 июл. 2016 г., 21:54:57
Просмотры: 39.3K
Голосов: 7

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

Пример:

Страница "Список всех продуктов 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' );
3
Комментарии

Вы пытались это сделать или у вас есть код, который можно показать?

Howdy_McGee Howdy_McGee
21 июл. 2016 г. 22:07:55

Я попробовал это: https://gist.github.com/luanpiegas/51560598cbee58e6881531ee003feab0

Luan Luan
21 июл. 2016 г. 22:09:22

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

Howdy_McGee Howdy_McGee
21 июл. 2016 г. 22:18:02
Все ответы на вопрос 3
0

Прежде всего, всегда лучше регистрировать шорткоды во время события 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();
}
21 июл. 2016 г. 22:51:50
0
    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"]

Данный код работает идеально!

4 нояб. 2018 г. 13:29:03
2
-1

Попробуйте этот код

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');
20 июн. 2017 г. 10:33:40
Комментарии

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

fuxia fuxia
20 июн. 2017 г. 11:23:05

Этот ответ вообще не отвечает на вопрос автора — он кажется совершенно не связанным с темой. Также в нём отсутствует какое-либо объяснение того, что он должен делать или как его использовать.

butlerblog butlerblog
11 нояб. 2018 г. 01:54:46