Intereting Posts
Добавить пользовательскую HTML-страницу в сообщениях После обновления wordpress с 4.4 до 4.5 настройка nginx работает неправильно Очистить корзину с плагином WordPress для электронной коммерции Страницы верхнего уровня переадресовываются на главную страницу! Пользовательские функции роли для администратора не вступают в силу (нет плагина) Исключить идентификатор сообщения из wp_query Привлечение всех пользователей к таксономии Многие плагины заставляют WordPress работать медленно по дизайну? Установите ссылку в дочерней теме style.css, чтобы перейти к #main Фильтр для пользователя SKU? пытаясь перечислить пользователей и отобразить их фамилию WP Query: странное поведение с несколькими неиерархическими налогами Как проверить расширение файла перед добавлением классов в среду Отображать сообщение мета условно на основе его значения the_excerpt Подробнее фильтр

Крюк запускается дважды на одной странице продукта Woocommerce

Я пытаюсь разработать плагин для расширения WooCommerce, и я хотел бы что-то сделать с идентификатором продукта, когда я приземляюсь на одной странице продукта (например, храните его в базе данных или храните в переменной сеанса).

Однако, какой бы крючок я ни пытался использовать, даются два результата. Например, я могу использовать hook woocommerce_single_product_summary следующим образом:

add_action( 'woocommerce_single_product_summary', 'do_my_thing' ); function do_my_thing() { global $post; store_the_id( $post->ID ); //some function to do something with the id } 

Когда пользователь попадает на страницу продукта, крючок запускается дважды, функция store_my_id выполняется дважды и с двумя разными идентификаторами сообщений. Первый – это правильный идентификатор продукта в вопросах, а второй – идентификатор для другого продукта.

Это происходит независимо от того, что я использую, например, get_header. Это не было бы проблемой, если бы я просто хотел что-то повторить на странице, потому что эхо-сигнал выводится только при первом запуске крюка.

Может ли кто-нибудь объяснить мне, что здесь происходит? Это должно произойти? И если это так, я могу отличить два идентификатора, которые вернулись, чтобы знать, что на самом деле является идентификатором продукта, на который я только что приземлился?

Я пробовал это на совершенно новой установке WordPress с установленным плагином WooCommerce, двадцатьюдесятью темами и двумя продуктами, поэтому я не думаю, что это вызвано тем, что я делаю.

Любая помощь действительно ценится …

РЕДАКТИРОВАТЬ

Я задавался вопросом, поможет ли использование get_queried_object (как показано ниже), но то же самое происходит

 add_action( 'woocommerce_single_product_summary', 'do_my_thing' ); function do_my_thing() { $queried_object = get_queried_object(); if ( $queried_object->post_type == 'product' ) { store_the_id( $queried_object->ID ); //some function to do something with the id } } 

Solutions Collecting From Web of "Крюк запускается дважды на одной странице продукта Woocommerce"

Вы должны ограничить себя основным циклом, и это можно сделать, установив, что is_main_query возвращает true.

Этого может быть недостаточно, поскольку этот крючок / фильтр, вероятно, был разработан с целью увеличения времени, и поэтому его можно было бы назвать более одного раза даже во время выполнения самого основного цикла. У вас есть два варианта здесь

  1. Используйте гораздо лучший крючок. Имя крючка не похоже на то, что вы должны запускать, когда записывает DB.

  2. вызовите remove_filter чтобы удалить его после первой итерации.

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

Таким образом, это означало, что следующий пост загружался и запускал все стандартные крючки.

На данный момент я использую фильтр next_post_rel_link (и на previous_post_rel_link всякий случай), как описано ниже, чтобы исправить проблему. Я не думаю, что у него будут какие-то негативные последствия, но я обновлю, если это произойдет …

 add_filter( 'next_post_rel_link', 'jlad_remove_pagination_rel_link' ); //may not be an issue for previous posts but just in case add_filter( 'previous_post_rel_link', 'jlad_remove_pagination_rel_link' ); function jlad_remove_pagination_rel_link($link) { global $post; //check this is a product so we don't mess with pagination elsewhere if ( $post->post_type == 'product' ) $link = ''; return $link; } 

EDIT И немного больше исследований заставляет меня думать, что это только проблема с Firefox с предварительной выборкой – на основе этого http://www.cre8d-design.com/2010/10/wordpress-relnext-causes-issues-in-firefox/