Шорткод с заголовком CPT в качестве атрибута - PullRequest
0 голосов
/ 03 мая 2019

Я создал CPT с 3 настраиваемыми полями (настраиваемые поля выполняются в плагине ACF). У меня есть шорткод, который отображает пользовательский пост в моей теме. Пока все хорошо.

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

В настоящее время, в зависимости от того, что у меня установлено posts_per_page, определяет, какой пост будет отображаться. Это полностью игнорирует атрибуты.

Вот что у меня есть:

// create custom post for jumbotron
function jumbotron_post_type()
{
    $labels = array(
        'name' => 'Jumbotrons',
        'singular_name' => 'jumbotron');
    $supports = array(
        'title'        
    );
    $args=array(
    'labels' => $labels,
    'supports' => $supports,
    'public' => true
    );
    register_post_type('Jumbotrons', $args);
}
add_action('init', 'jumbotron_post_type');

// create shortcode for display

function show_jumbotron($atts, $content = null )
{
   extract(shortcode_atts(array(
      'id' => 'new-jumbo',
      'per_page' => -1,
  ), $atts));

    $args = array(
        'posts_per_page' => $per_page, 
        'title' => $id,
        'post_type' =>'Jumbotrons'        
    );
    $results = new WP_Query($args);

    while ($results->have_posts()):
        $results->the_post();
    ob_start(); ?>
            <section class="jumbotron">
                <div class="jumbotron--container">
                    <h1><?php the_field('jumbotron_title'); ?></h1>
                    <p class="info"><?php the_field('jumbotron_body'); ?></p>
                    <h2 class="u--text__right"><?php the_field('jumbotron_end_heading'); ?></h2>
                </div>
            </section>
            <?php
        $content = ob_get_clean();
    endwhile;
    wp_reset_postdata();
    return $content;
};

add_shortcode('jumbotron', 'show_jumbotron');

В теме у меня есть:

<?php echo do_shortcode('[jumbotron id="Homepage Jumbotron"]');?>   

Если я установлю posts_per_page на -1, он покажет самый старый пользовательский пост. Если я установлю на 1, то он покажет самый последний.

2 наименования CPT:

  • Новый Джамбо
  • Домашняя страница Jumbotron

Мое намерение было бы для [jumbotron title="Homepage Jumbotron"] отобразить правильный пользовательский пост на основе введенного заголовка с значением по умолчанию "New Jumbo".

Ответы [ 2 ]

0 голосов
/ 04 мая 2019
Hey megler use my below code. I hope it should work.

function show_jumbotron($atts, $content = null )
{
   extract(shortcode_atts(array(
      'title' => 'New Jumbo',
      'per_page' => 1,
  ), $atts));

    $args = array(
        'posts_per_page' => $per_page, 
        'title' => $title,
        'post_type' =>'Jumbotrons'        
    );
    $results = new WP_Query($args);

    while ($results->have_posts()):
        $results->the_post();
    ob_start(); ?>
            <section class="jumbotron">
                <div class="jumbotron--container">
                    <h1><?php the_field('jumbotron_title'); ?></h1>
                    <p class="info"><?php the_field('jumbotron_body'); ?></p>
                    <h2 class="u--text__right"><?php the_field('jumbotron_end_heading'); ?></h2>
                </div>
            </section>
            <?php
        $content = ob_get_clean();
    endwhile;
    wp_reset_postdata();
    return $content;
};

add_shortcode('jumbotron', 'show_jumbotron');

Then add shortcode like this:

<?php echo do_shortcode('[jumbotron title="Homepage Jumbotron"]');?>   
<?php echo do_shortcode('[jumbotron title="New Jumbo"]');?>   

I hope this will work. 

Thank you.
0 голосов
/ 04 мая 2019

Я нашел ошибку.Идентификатор должен быть установлен в пустую строку

'id' => ''

Рабочий код:

// create shortcode for display

function show_jumbotron($atts, $content = null )
{
    extract(shortcode_atts(array(
      'id' => '',
      'per_page' => -1,
  ), $atts));

    $args = array(
        'post_type' =>'Jumbotrons',
        'posts_per_page' => $per_page, 
        'title' => $id
    );
    $results = new WP_Query($args);

    while ($results->have_posts()):
        $results->the_post();
    ob_start(); ?>
            <section class="jumbotron">
                <div class="jumbotron--container">
                    <h1><?php the_field('jumbotron_title'); ?></h1>
                    <p class="info"><?php the_field('jumbotron_body'); ?></p>
                    <h2 class="u--text__right"><?php the_field('jumbotron_end_heading'); ?></h2>
                </div>
            </section>
            <?php
        $content = ob_get_clean();
    endwhile;
    wp_reset_postdata();
    return $content;
};

add_shortcode('jumbotron', 'show_jumbotron');
...