2016-03-14 3 views
0

Мне нужно показать пост из списка архивов по почте. Я создал плагин с этим кодом:the_permalink in loop дает те же результаты

function posts_by_year() { 
    // array to use for results 
    $years = array(); 

    // get posts from WP 
    $posts = get_posts(array(
    'numberposts' => -1, 
    'orderby' => 'post_date', 
    'order' => 'ASC', 
    'post_type' => 'post', 
    'post_status' => 'publish' 
)); 

    // loop through posts, populating $years arrays 
    foreach($posts as $post) { 
    $years[date('Y', strtotime($post->post_date))][] = $post; 
    } 

    // reverse sort by year 
    krsort($years); 

    return $years; 
} 
?> 

<?php function wyswietl_archiwum(){ ob_start(); ?> 

<?php foreach(posts_by_year() as $year => $posts) : ?> 
    <h2><?php echo $year; ?></h2> 
    <ul> 
    <?php foreach($posts as $post) : setup_postdata($post); ?> 
     <li> 
     <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> 
     </li> 
    <?php endforeach; ?> 
    </ul> 
<?php endforeach; ?> 
<?php 
    return ob_get_clean(); 
} ?> 

<?php add_shortcode('archiwum', 'wyswietl_archiwum'); 

Когда я положил шорткод [archiwum] на любой странице, я получаю список, но каждый один пункт отображает название текущей страницы и ссылки на себя.

скриншот: screenshot

Любая идея, как сделать правильный?

ответ

0

the_permalink() и the_title() (и подобные функции) используют глобальную переменную $post, чтобы определить, какое сообщение должно отображаться. Поскольку цикл foreach находится в функции, в дополнение к вызову setup_postdata($post) вам также необходимо обновить глобальную переменную $post.

В documentation детали это:

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

Самый простой способ сделать это было бы добавить global $post; в верхней части функции wyswietl_archiwum. В качестве альтернативы вы можете сделать $GLOBALS["post"] = $post; в цикле foreach.

+0

Именно так работает 'the_date' [documented] (https://codex.wordpress.org/Function_Reference/the_date). В документации также описывается, как получить нужное поведение в «Специальном примечании». –

+0

Спасибо! Я использовал второй метод, и он работает! –

+0

Спасибо за быстрый ответ на мой второй вопрос. Я обманул себя, чтобы не проверять документацию. Вместо этого я использовал the_time ('d.m'). –

Смежные вопросы