Превратите WP Query в ShortCode Wordpress

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

Вот запрос wp

<?php $schools = $post->ID; // the current post id ?>

    <?php
    $args = array( 
        'post_type' => 'teacher',
        'meta_query' => array(
            array(
                'key'     => 'areas_of_focus',
                'value'   => $schools,
                'compare' => 'LIKE',
            ),
        ),
    );

    $schools_data_query = new WP_Query($args);

    ?>

    <?php

    if ( $schools_data_query->have_posts() ) {
        echo '<ul>';
        while ( $schools_data_query->have_posts() ) {
            $schools_data_query->the_post();
            //echo '<li>' . get_the_title() . '</li>';
            //echo '<li>' . get_permalink() . '</li>'; ?>        
           <li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>

    <?php
        }
        echo '</ul>';
    } else {
        // no posts found
    }

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

function list_teacher_shortcode($atts){
    global $post;
    $schools = $post->ID;
    $args = array( 
    'post_type' => 'teacher',
    'meta_query' => array(
        array(
            'key'     => 'areas_of_focus',
            'value'   => $schools,
            'compare' => 'LIKE',
        ),
    ),
);
    $schools_data_query = new WP_Query($args);
    global $post;
    $schools = $post->ID;
    $content = '';
    $content .= '<ul>';
        while($schools_data_query->have_posts()) : $schools_data_query->the_post();
        $content .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
        endwhile;
    $content .= '</ul>';
    wp_reset_query();
    return $content;
}
add_shortcode('list_teacher', 'list_teacher_shortcode');

Я не очень хорошо разбираюсь в этом бэкэнд-программировании, но я предполагаю, что это как-то связано с

глобальный $пост;

$schools = $post->ID;

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


person Vince Mamba    schedule 04.12.2015    source источник


Ответы (1)


Что вы используете global $post; в вашем шорткоде он занимает последний пост на странице, поэтому вы должны отправить идентификатор поста в свой шорткод

echo do_shortcode('[list_teacher postID="'.$post->ID.'"]');

И получите его внутри функции list_teacher_shortcode.

 $a = shortcode_atts( array(
     'postID' => '',
 ), $atts );
 $postID = $a['postID'];

Тогда вам не нужен этот код (вы используете его дважды):

global $post;
$schools = $post->ID;

ОБНОВИТЬ

Вы также можете использовать $query->the_post() и wp_reset_post_data() внутри своего шорткода. Подробнее здесь https://codex.wordpress.org/Function_Reference/wp_reset_postdata.

ОБНОВЛЕНИЕ 2 ПОЛНЫЙ КОД

Поместите его там, где вы хотите использовать шорткод

echo do_shortcode('[list_teacher postID="'.$post->ID.'"]');

Вот ваш полный шорткод

function list_teacher_shortcode($atts){
    $a = shortcode_atts( array(
        'postID' => '',
    ), $atts );
    $schools = $a['postID'];
    $args = array( 
    'post_type' => 'teacher',
    'meta_query' => array(
        array(
            'key'     => 'areas_of_focus',
            'value'   => $schools,
            'compare' => 'LIKE',
        ),
    ),
);
    $schools_data_query = new WP_Query($args);
    $content = '';
    $content .= '<ul>';
        while($schools_data_query->have_posts()) : $schools_data_query->the_post();
        $content .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
        endwhile;
    $content .= '</ul>';
    wp_reset_query();
    return $content;
}
add_shortcode('list_teacher', 'list_teacher_shortcode');

ОБНОВЛЕНИЕ 3

Кроме того, вы можете использовать описание get_the_ID() здесь. Затем вы можете удалить атрибуты из функции шорткода. и ваша первая строка функции должна выглядеть так:

$school = get_the_ID();
person MurDaD    schedule 04.12.2015
comment
Извините, мне трудно следить :/ - person Vince Mamba; 04.12.2015
comment
спасибо, это помогает, единственная проблема в том, что я превращаю это в шорткод, поэтому я могу поместить его в область боковой панели в wordpress, однако шорткоды не принимают PHP в области боковой панели. так что это должно быть что-то вроде [list_teacher] - person Vince Mamba; 05.12.2015