Поддержка Проблемы и решения непонятная смена ID записи

  • Решено Flector

    (@flector)


    простейший код (формирую rss-ленту):

    
    $content = get_post_field('post_content', get_the_ID());
    var_dump(get_the_ID());
    $content = do_shortcode($content);
    var_dump(get_the_ID());
    

    результат:

    
    int(4578)
    int(4585)
    

    где 4578 правильный ID, а 4585 это ID первой записи в цикле.
    в самой записи может быть вообще ничего нет (проверял).
    опытным путем установил, что ID меняется при включенном вукомерсе.
    отключаю вукомерс — ID правильные.

    на локальном сервере проблему воспроизвести не удалось — на клиентском сайте ломаю себе голову.

    хоть в какую сторону копать?

Просмотр 12 ответов — с 16 по 27 (всего 27)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    прям что-то я начудил сам в плагине с циклами

    Всплыл третий, доселе неизвестный плагин 🙂

    Всплыл третий, доселе неизвестный плагин 🙂

    да я же написал, RSS формирую. ну не вручную, плагином — https://wordpress.org/plugins/rss-for-yandex-turbo/

    Если нужно просто после do_shortcode() получить исходную запись, можно попробовать вызвать wp_reset_postdata().

    прям так?

    
    $content = apply_filters('the_content', get_post_field('post_content', get_the_ID()));
    $content = do_shortcode($content);
    wp_reset_postdata();
    

    только вот код:

    
    <h1><?php the_title_rss(); ?></h1>
    

    все равно отдает заголовок от первой записи цикла.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    прям так?

    Ага.

    the_title_rss()

    Она же раньше вызывается, чем yturbo_the_content_feed()? Или имеется в виду следующая итерация?

    Шорткод [product] в итоге запускает метод WC_Shortcode_Products::product_loop(), и в нём действительно перезаписывается $post, но затем восстанавливается. Можно копнуть глубже там — видимо, в сочетании с Visual Composer что-то идёт не так 🙂

    Она же раньше вызывается, чем yturbo_the_content_feed()? Или имеется в виду следующая итерация?

    там дубль идет типа:

    
    <title><?php the_title_rss(); ?></title>
    ....
    $content = yturbo_the_content_feed();
    ....
    <h1><?php the_title_rss(); ?></h1>
    ....
    <?php echo PHP_EOL.yturbo_add_advert($content); ?>
    

    хотя можно, наверное, запихнуть это в переменную до вызова yturbo_the_content_feed, а потом просто echo его.

    PS хотя не, я там $content обрабатываю, используя get_the_ID() везде, где можно, не прокатит.

    • Ответ изменён 6 лет, 1 месяц назад пользователем Flector.
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Сейчас заметил, что там произвольные циклы — wp_reset_postdata() в данном случае не подойдёт, потому что использует основной.

    А если так?

    
    setup_postdata( $GLOBALS['wp_query']->post->ID );
    

    Или так:

    
    $post_id = get_the_ID();
    $content = do_shortcode( $content );
    setup_postdata( $post_id );
    

    в $GLOBALS[‘wp_query’]->post->ID то же первый ID цикла.
    попробовал так:

    
    $tt = get_the_ID();
    var_dump($tt);
    $content = yturbo_the_content_feed();
    var_dump($tt);
    setup_postdata( $tt );
    var_dump(get_the_ID());
    

    результат:

    
    int(4574)
    int(4574)
    int(4585)
    

    попробовал так:

    
    global $post;
    $tt = $post;
    var_dump($tt->ID);
    $content = yturbo_the_content_feed();
    var_dump($tt->ID);
    setup_postdata( $tt );
    var_dump(get_the_ID());
    

    результат тот же:

    
    int(4574)
    int(4574)
    int(4585)
    
    
    $post_id = get_the_ID();
    $content = apply_filters('the_content', get_post_field('post_content', get_the_ID()));
    setup_postdata( $post_id );
    

    так тоже не катит.

    в итоге помогло такое:

    
    global $post;
    $tt = $post;
    $content = yturbo_the_content_feed();
    $post = $tt;
    setup_postdata( $post );
    

    оказывается в setup_postdata можно передавать только $post (вычитал здесь).

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    С версии 4.4 можно и ID.

    Но тут важно было именно глобальную переменную $post восстановить, а этого функция не делает, упустил данный момент.

    Юрий, Сергей — спасибо большое.

Просмотр 12 ответов — с 16 по 27 (всего 27)
  • Тема «непонятная смена ID записи» закрыта для новых ответов.