Безопасный способ получить идентификатор сообщения в файле the_title ()

Есть ли безопасный способ получить идентификатор сообщения внутри the_title() ?

 add_filter('the_title', "change_post_title"); function change_post_title($title){ } 

Я попытался использовать global $post и get_the_ID() , но в некоторых случаях это не сработает (например, на одной странице, где в the_title() чтобы ссылаться на следующую запись. global $post и get_the_ID() будет ссылаться на единственный пост вместо сообщения, которое связано с.)

С get_page_by_title() мне пришлось бы порождать несколько запросов, чтобы охватить все типы сообщений.

Должен ли я вернуться к пользовательскому запросу?

Некоторые фильтры в WordPress просто не удобны для пользователя и не всегда делают то, что хочется.

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

Недавно я столкнулся с этим Джошем Левинсоном в своем блоге, имея такую ​​же проблему. Он предложил использовать действие loop_start где вы проверяете, находитесь ли вы в основном запросе, и если вы используете, примените ваш фильтр the_title . Если запрос не является основным запросом, просто удалите фильтр

Я внес несколько изменений в исходный код. Просто примечание, вам нужен php 5.3+, поскольку закрытие было введено только в php 5.3

 add_action('loop_start', function ($q) { if($q->is_main_query()){ add_filter( 'the_title', 'modified_post_title', 10, 2); }else{ remove_filter('the_title','modified_post_title', 10, 2); } }); function modified_post_title($title) { global $post; ?><pre><?php var_dump($post->ID); ?></pre><?php }