Поддержка → Проблемы и решения → непонятная смена ID записи
непонятная смена ID записи
-
простейший код (формирую 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 правильные.на локальном сервере проблему воспроизвести не удалось — на клиентском сайте ломаю себе голову.
хоть в какую сторону копать?
-
То есть, что-то во время выполнения функции do_shortcode() меняет глобальную $post, причем даже если шорткодов в контенте нет и не вызван ни один из колбэков? Ну, я бы понатыкал var_dump в саму функцию do_shortcode(), там не там много внутренностей. А дальше по результатам.
Это как раз тот случай, когда говорят «вскрытие покажет».
Также я бы чисто из любопытства сравнил результат работы get_the_ID() с $GLOBALS[‘post’]->ID. Фиг его знает зачем.
с глобал та же хрень:
int(4581) int(4581) int(4585) int(4585)
do_shortcode счас проверю.
с глобал та же хрень:
Отлично! 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)
только мне это ни о чем не говорит 🙁
У меня пока не воспроизвелось, но этот код должен показать, какой именно шорткод меняет
$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_column_text]
там код аля:
[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"]
находится внутри шорткода от визуального билдера. это может влиять?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>
[product id="1364"]
находится внутри шорткода от визуального билдера. это может влиять?Как видно — может 🙂 Но если код WooCommerce более-менее понятно структурирован и хорошо документирован, но с Visual Composer, похоже, не так всё просто.
Если нужно просто после
do_shortcode()
получить исходную запись, можно попробовать вызватьwp_reset_postdata()
.так беда в том, что запись я пробовал вообще удалить — ну там тупо «тест» в тексте и все — без единого шорткода. но ID при включенном вукомерсе все равно меняются.
я уже человека заставил обновить и движок и все плагины и тему — а итог все тот же, не работает.
да и вообще, за последние 3 недели это уже 4-ый человек, который жалуется, что в RSS встречаются повторяющиеся заголовки. раньше такой фигни не было, да и вукомерс не у всех установлен. вообще не понимаю 🙁 прям что-то я начудил сам в плагине с циклами, но не могу понять в чем дело и в какую сторону копать — потому что непонятно, где именно эта ошибка возникает.
в стандартном фиде от движка таких проблем не вижу.
-
Ответ изменён 5 лет, 1 месяц назад пользователем
- Тема «непонятная смена ID записи» закрыта для новых ответов.