Intereting Posts
Могу ли я изменить, какие поля отображаются в форме комментариев? Способ получения изображения или первого изображения и обрезания на лету перед отображением require_once не работает Пользовательская форма для загрузки изображения на wordpress Адаптивные фильтры продуктов для WooCommerce Запрос, если пользовательское поле ввода аудио и / ИЛИ Добавление в эту функцию нескольких переменных как загрузить файл в медиа-библиотеку, используя ссылку Удалить теги p в сообщениях WordPress Есть ли способ перечислить все используемые / неиспользуемые шаблоны WP? Избранный снимок для обмена социальными сообщениями на странице архивного архива Список авторов с последним заголовком и порядком последнего сообщения Добавить бесконечный свиток в Ajax Loaded Category Query Перенаправление после сохранения формы; и все же используйте wp_die () Wrap Количество сообщений в диапазоне

Фильтр the_title, возвращающий неправильный тип сообщения

Я использую фильтр the_title чтобы попытаться добавить некоторый текст к типу пользовательского типа сообщения. Наш сайт имеет несколько пользовательских типов сообщений.

  1. Продукт – слизь – это eproduct
  2. Бренд – slug – это brand-listing
  3. Розничная торговля – slug – это retail-listing

Я пытаюсь добавить заголовок соответствующего бренда продукта в начало названия продукта.

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

echo "Initial title is {$title} Initial id is {$id}";

Этот оператор возвращает заголовок и идентификатор определенного типа персонализированного типа Retail . Это происходит независимо от того, какую конкретную страницу продукта я просматриваю. Оператор echo всегда перекликается с заголовком и идентификатором того же самого типа персонализированного типа Retail. Я ожидал, что выражение echo будет эхо-заголовка и идентификатора продукта , отображаемого на странице.

Я попытался вникнуть в фактический SQL-запрос, чтобы увидеть, могу ли я найти что-то не так, но я новичок в SQL. Ниже я вырезал и вставил дословный SQL-запрос. Этот SQL-запрос кажется мне подозрительным, потому что он запрашивает несколько пользовательских типов сообщений, когда я ожидал, что он будет запрашивать eproduct пользовательский тип eproduct на странице, на которой отображается один Продукт. Для меня, по-видимому, почему-то часть запроса SQL, запрашивающая wp_posts.post_type = retail-listing , каким-то образом «выигрывает», поскольку это заголовок и идентификатор типа персонализированного типа розничной торговли, которые передаются мне функция обратного вызова.

 SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'um_role' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'um_role' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_name = 'testing-product-description' AND wp_posts.post_type = 'eproduct' ORDER BY wp_posts.post_date DESC SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'retail-listing' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'brand-listing' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC SELECT wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'um_notice' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC 

the_title функции обратного вызова the_title приведен ниже:

 /** * Prepend Brand name to Product post title. * Use 'the_title" filter. * Arguments: (string) the post title, (int) the post id */ function vendia_prepend_brand_to_product_title( $title, $id ) { remove_filter( current_filter(), __FUNCTION__ ); echo "Initial title is {$title} Initial id is {$id}"; //Should work on single product pages, product archive pages, and search pages. if ( is_post_type_archive( 'eproduct' ) || is_singular ( 'eproduct' ) || is_search() ) { $brand_id = get_post_meta( $id, '_wpcf_belongs_brand-listing_id', $single = true); echo "Brand ID is {$brand_id}"; $brand_title = get_the_title( $brand_id ); $new_title = $brand_title . ' ' . $title; return $new_title; } } add_filter( 'the_title', 'vendia_prepend_brand_to_product_title', 10, 2 ); 

Поэтому, по сути, мой вопрос: почему моя the_title обратного вызова the_title получает параметры (Title и ID), связанные с определенным типом персонализированного типа Retail (точно такой же розничный пост каждый раз), вместо того, чтобы получать заголовок и идентификатор конкретного продукта, отображается на странице?

Большое вам спасибо за любую помощь.

Solutions Collecting From Web of "Фильтр the_title, возвращающий неправильный тип сообщения"

У вас есть несколько вопросов здесь

  • remove_filter( current_filter(), __FUNCTION__ ) используется в неправильном контексте здесь для того, что вам нужно сделать. remove_filter() отключает фильтр из массива GLOBALS после того, как фильтр запускается один раз, поэтому ваш фильтр удаляется после первого запуска. Это происходит с функциями спагетти.

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

  • get_the_title() просто использует get_post чтобы получить объект post, чтобы вернуть свойство $post_title объекта, если объект post не передан get_the_title() . Таким образом, вместо использования get_the_title() который влияет фильтр, просто используйте get_post и оттуда получите заголовок сообщения

Я просто переписал бы фильтр следующим образом:

 add_filter( 'the_title', function ( $title, $id ) { // Make sure we are not in admin, if so, return $title if ( is_admin() // Check if we are in admin ) return $title; //Should work on single product pages, product archive pages, and search pages. if ( is_post_type_archive( 'eproduct' ) || is_singular ( 'eproduct' ) || is_search() ) { $brand_id = get_post_meta( $id, '_wpcf_belongs_brand-listing_id', $single = true); // Make sure we have a $brand_id to avoid bugs and unexpected output if ( $brand_id ) { $brand_title = get_post( $brand_id )->post_title; $title = $brand_title . ' ' . $title; } // Either return title as is or our new modified title return $title; } // Make sure we return $title if our conditions should fail return $title; }, 10, 2 ); 

Еще одно замечание, вы, вероятно, захотите обернуть все в состоянии in_the_loop() только для целевых титров в основном цикле запросов

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

Я забыл сказать, что для кода выше требуется, по крайней мере, PHP 5.4 из-за прямого перенаправления массива. Код также не проверен