Получение идентификатора записи снаружи за пределами цикла WordPress

#wordpress

#wordpress

Вопрос:

Итак, у меня есть фрагмент кода, который захватывает категории и их совпадающие записи и перечисляет их вне цикла (ниже). Я пытался заставить публикацию ссылаться на #post-[ID] вместо постоянной ссылки, но у меня все время не получается. Кто-нибудь может помочь?

 <ul id="sidebar">
<?php
    foreach( get_categories('orderby=IDamp;order=desc') as $cat ) :
    if( !$cat->parent ) {
    echo '<li class="title"><h2><a href="#">' . $cat->name . '</a></h2>';
    echo '<ul>';
    process_cat_tree( $cat->term_id );
            }
    endforeach;

    wp_reset_query(); //to reset all trouble done to the original query
    //
    function process_cat_tree( $cat) {
    $args = array('category__in' => array( $cat ), 'numberposts' => -1);
    $cat_posts = get_posts( $args );
    $id = $post->ID;

    global $post;
    if( $cat_posts ) :
    foreach( $cat_posts as $menuPost ) :
    echo '<li';
    if ( $menuPost->ID == $post->ID ) { echo ' class="active"'; }
    echo '>';
    echo '<a href="' . get_permalink( $menuPost->ID ) . '">' . $menuPost->post_title . '</a>';
    echo '</li>';
    endforeach;
    endif;

    echo '</ul></li>';
    }
?>
  

Приведенный выше код выводит теги UL / LI следующим образом:

  • Категория
    • Публикация
    • Публикация
    • Публикация
  • Категория
    • Публикация
    • Публикация
    • Публикация
  • Категория
    • Публикация
    • Публикация
    • Публикация

Комментарии:

1. Уточните, что вы подразумеваете под «ссылкой на #post-[ID]», и я соответствующим образом обновлю свой ответ.

Ответ №1:

По общему признанию, я не совсем понимаю, что вы подразумеваете под «ссылкой на #post-[ID]», но продолжаю с заголовком вопроса:

Если вы используете get_permalink() при повторном переходе по ссылке, вы получите постоянную ссылку — это именно то, что делает эта функция.

Используйте get_the_ID() вместо этого, если вы хотите, чтобы идентификатор записи возвращался, или the_ID() если вы хотите, чтобы он отображался ( the_ID() это то же самое, что echo get_the_ID() ).

Отредактировано отсюда:

Если в остальном вас устраивает приведенный выше код, измените

  echo '<a href="' . get_permalink( $menuPost->ID ) . '">' . $menuPost->post_title . '</a>';
  

Для

  echo '<a href="#post-' . $menuPost->ID . '">' . $menuPost->post_title . '</a>';
  

должен это сделать.

Тем не менее, я бы поступил так:

 echo '<ul>';
$cat_args = array(
    'orderby' => 'name',
    'order' => 'ASC'
);
$categories = get_categories($cat_args);

foreach($categories as $category) { 
    echo '<li class="title"><h2><a href="#">' . $category->name . '</a></h2><ul>';
    // query posts of that category:
    $query_args = array(
        'cat' => $category->cat_ID,
        'posts_per_page' => -1
    );
    $your_query = new WP_Query( $query_args );
    // loop through them:
    while ( $your_query->have_posts() ) : $your_query->the_post();
        echo '<li><a href="#post-';
        the_ID();
        echo '">';
        the_title();
        echo '</a></li>';
    endwhile;
    echo '</ul></li>';
    // Reset Post Data
    wp_reset_postdata();
}
echo '</ul>';
  

Комментарии:

1. Я буду внедрять вкладки Jquery. Поскольку каждой записи присваивается post-[id], мне нужна ссылка в списке сообщений по категориям, указывающая на #post-[id]. И к вашему сведению: я несколько новичок в разработке WordPress.

2. @user1036169 Хорошо. Давайте на секунду забудем ваш фрагмент кода выше — там происходит много странностей. Я, например, вижу wp_reset_query(); но не new WP_Query() в первую очередь. Вам нужен список всех записей, упорядоченных по (подкатегориям). В каждом элементе списка вам нужна какая именно информация? Пожалуйста, обновите свой вопрос примером структуры списка и содержимого элемента списка без кода.

3. итак, я заменил echo ‘<a href=»‘ . get_permalink( $menuPost-> ID ) . ‘»>’ . $menuPost-> post_title . ‘</a>’; на echo ‘<a href=»#post-‘ . get_the_ID( $menuPost-> ID ) . ‘»>’ . $menuPost-> post_title . ‘</a>’; но он выводит один и тот же идентификатор для каждой ссылки. Есть идеи, что является причиной этого?

4.Он выводит идентификатор записи / страницы, на которой вы в данный момент находитесь. Для того, чтобы он выполнял то, что вы хотите, он должен находиться внутри цикла. Смотрите мой комментарий выше — к сожалению, ваш код не может быть исправлен изменением одной строки. Я знаю, что заголовок вашего вопроса предполагает, что вы хотите, чтобы он был снаружи, но вам не нужно использовать встроенный цикл темы. Тем не менее, вам нужно правильно перебирать записи.

5. Итак, чтобы заставить его работать так, как мне нужно, он ДОЛЖЕН быть внутри цикла? Но если я помещу это в цикл, вкладки jQuery не будут работать корректно, не так ли? Простите, если я немного запутался.