Поддержка Проблемы и решения непонятная смена 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 правильные.

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

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

Просмотр 15 ответов — с 1 по 15 (всего 27)
  • Модератор Yuri

    (@yube)

    То есть, что-то во время выполнения функции do_shortcode() меняет глобальную $post, причем даже если шорткодов в контенте нет и не вызван ни один из колбэков? Ну, я бы понатыкал var_dump в саму функцию do_shortcode(), там не там много внутренностей. А дальше по результатам.

    Это как раз тот случай, когда говорят «вскрытие покажет».

    Модератор Yuri

    (@yube)

    Также я бы чисто из любопытства сравнил результат работы get_the_ID() с $GLOBALS[‘post’]->ID. Фиг его знает зачем.

    с глобал та же хрень:

    
    int(4581)
    int(4581)
    int(4585)
    int(4585)
    

    do_shortcode счас проверю.

    Модератор Yuri

    (@yube)

    с глобал та же хрень:

    Отлично! get_the_ID() не виноват.

    ID меняется после функции:

    
    var_dump(get_the_ID());
    $content = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $content );
    var_dump(get_the_ID());
    

    результат:

    
    int(4578)
    int(4585)
    

    только мне это ни о чем не говорит 🙁

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    У меня пока не воспроизвелось, но этот код должен показать, какой именно шорткод меняет $post:

    
    function check_post_id( $output, $tag ) {
    	static $post_id;
    
    	if ( ! isset( $post_id ) ) {
    		$post_id = get_the_ID();
    	}
    
    	if ( get_the_ID() != $post_id ) {
    		printf( 'Post changed by [%s] shortcode.', $tag );
    		die();
    	}
    
    	return $output;
    }
    add_filter( 'do_shortcode_tag', 'check_post_id', 10, 2 );
    

    результат:

    
    Post changed by [vc_column_text] shortcode.
    

    отключаю WPBakery Page Builder и Ultimate Addons for Visual Composer — ID по-прежнему неправильные, но сообщение ‘Post changed’ пропадает.

    • Ответ изменён 5 лет, 1 месяц назад пользователем Flector.

    там код аля:

    
    [vc_row][vc_column][vc_column_text]Очистка резервуара от мазута - это очень важная процедура. В резервуарах с течением времени образуются осадки с содержанием различных примесей, которые снижают уровень качества мазута и уменьшают скорость его разогрева. Энергетические затраты при этом возрастают на 20%. А низкокачественный мазут снижает топливную эффективность почти на треть. Давайте разберемся, какими методами и средствами осуществляется очищение резервуаров от мазутных остатков.
    <h2>Особенности очистки резервуаров</h2>
    Очистка резервуара от мазута на промышленных предприятиях проводится профессионалами, применяющими моющие средства с агрессивным составом, которые требуют правильной утилизации. Остатки химических средств нельзя сливать на почву и в реки, так как это промышленные загрязнения, требующие проведения прочистки системы канализации. Технологию очистки определяют исходя из условий и количества загрязнений.
    
    Чтобы избавиться от мазутных пятен в бытовых условиях, рекомендовано применение концентрированных профессиональных очистителей, которые дают возможность эффективно удалить масла, нефтепродукты, горюче-смазочные материалы, смазки и прочее. Химические очистители можно применять на любой поверхности, не травмируя ее. Очистители биологически разлагаются и, в отличие от других средств, не имеют в составе ртутных, кислотных и едких примесей. Состав пожаробезопасен и взрывобезопасен.
    <h2>Особенности применения и преимущества химического очистителя</h2>
    Очиститель нефтепродуктов - это концентрат на водной основе с щелочным составом. Он дает возможность удалить нефтепродукты из разных ёмкостей, со специального оборудования, с разнообразных покрытий и стройматериалов.
    
    Прежде чем начать работу, нужно развести средство с водой и хорошо перемешать состав для получения однородности. Разводится концентрированное средство в соотношении 1:4-1:15. Пропорция может меняться в зависимости от типа поверхности и количества загрязнений. Раствор становится более эффективным во время добавления горячей воды. После того, как раствор будет приготовлен, его нужно израсходовать в течение пяти дней. Средство можно наносить различными способами (вручную, методом погружения, мойкой высокого давления).
    
    К преимуществам химического очистителя относят высокую эффективность, высокий уровень концентрации активных элементов, экономичный расход и возможность многоцелевого использования.
    <h2>Техника безопасности при обработке химическим средством</h2>
    Если Вы очищаете конструкции химическими составами, нужно соблюдать правила техники безопасности и использовать во время работы средства индивидуальной защиты. Наденьте сменную одежду или фартук. Вам потребуются резиновые перчатки для защиты кожных покровов от химических компонентов, респиратор для защиты органов дыхания и специальные очки для предотвращения проникновения средства в глаза. Если такое произошло, как можно скорее промойте пораженный участок тела водой и обратитесь к врачу. Химические составы следует хранить в недоступном для детей и домашних питомцев месте.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][ultimate_heading main_heading="Рекомендуем" alignment="left" margin_design_tab_text=""][/ultimate_heading][product id="1364"][/vc_column][/vc_row]
    

    то есть [product id="1364"] находится внутри шорткода от визуального билдера. это может влиять?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    ID по-прежнему неправильные, но сообщение ‘Post changed’ пропадает.

    А так?

    
    function check_post_id( $output, $tag ) {
    	global $wp_the_query;
    
    	if ( get_the_ID() != $wp_the_query->post->ID ) {
    		printf( 'Post changed by [%s] shortcode.' . "<br />\n", $tag );
    	}
    
    	return $output;
    }
    add_filter( 'do_shortcode_tag', 'check_post_id', 10, 2 );
    
    
    Post changed by [vc_row] shortcode.
    

    при включенном билдере, если отключить — сообщение пропадает, ID по-прежнему неправильные после do_shortcode.

    хотя вру, там полностью при включенном билдере что-то типа:

    
    int(4574)
    Post changed by [vc_row] shortcode.<br />
    int(4585)
            <header>
                <figure><img src="https://xxxxx.ru/wp-content/uploads/2018/02/ochistka_rezervuara_ot_mazuta-300x225.jpg" /></figure>
            <h1>Очистка резервуара от мазута</h1>
            </header>
                                    
    <p>Post changed by [vc_column] shortcode.</p>
    <div class="vc_row wpb_row row">Post changed by [vc_column_text] shortcode.</p>
    
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    [product id="1364"] находится внутри шорткода от визуального билдера. это может влиять?

    Как видно — может 🙂 Но если код WooCommerce более-менее понятно структурирован и хорошо документирован, но с Visual Composer, похоже, не так всё просто.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

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

    так беда в том, что запись я пробовал вообще удалить — ну там тупо «тест» в тексте и все — без единого шорткода. но ID при включенном вукомерсе все равно меняются.

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

    да и вообще, за последние 3 недели это уже 4-ый человек, который жалуется, что в RSS встречаются повторяющиеся заголовки. раньше такой фигни не было, да и вукомерс не у всех установлен. вообще не понимаю 🙁 прям что-то я начудил сам в плагине с циклами, но не могу понять в чем дело и в какую сторону копать — потому что непонятно, где именно эта ошибка возникает.

    в стандартном фиде от движка таких проблем не вижу.

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