Как я могу обнаружить слаг пользовательского типа, когда я нахожусь на странице архива?
Например, если шаблон /products/
запускается archive-products.php
, как (прагматично) я могу получить слаг типа поста?
Благодарность
custom-post-types
archives
custom-post-type-archives
Бен Эверард
источник
источник
get_queried_object()
получал бы ту же информацию за меньшее количество ходов.$posttype = get_query_var('post_type');
... я добавил всеобъемлющую альтернативу.Я использую это вне цикла в шаблоне archive.php, чтобы узнать, какой пользовательский почтовый архив я использую.
Это комбинация методов, рекомендованных @toscho и @Rarst:
Обновление: @majick отметил, что это работает, только если вы установили параметр перезаписи для своего CPT. Перезапись slug не обязательна при регистрации CPT и по умолчанию post_type, если не установлен.
источник
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
Ответы становятся запутанными. И, может быть, я тоже, но главный вопрос:
Если вы имеете в виду целевую страницу архива с типом поста и при
is_post_type_archive()
возвратеtrue
вам нужен слаг, отвечающий на текущий просматриваемый архив:- КОНЕЦ ОТВЕТА НА ВОПРОС -
Объяснение:
Вы не можете положиться на зарегистрированный слизень . Wordpress тоже нет. Например, при вызове
get_post_type_archive_link()
Wordpress выполняется проверка текущих правил перезаписи для вашей установки .Где бы вы ни, внутри или вне контура, текущий архив или одиночный пост, реверс на
get_post_type_archive_link()
механизм. (Постоянные ссылки включены.)Соображения:
Как уже упоминалось, тип (ы) записей в текущем запросе может быть
array
. Вы можете пойти дальше со своими намерениями, отфильтровав тип сообщения, который вы ищете, например:или
Другая точка зрения:
Пример Woocommerce, зарегистрирован в объекте типа поста 'products', но в действительности использует переписанное имя правила (shop):
источник
Следует отметить, что если
has_archive
при регистрации пользовательского типа записи установлено значение true, архив типа записи/cptslug/
будет внутренне перезаписан?post_type=cptslug
. Так что это такжеis_post_type_archive()
будет означать , вернется правда.К сожалению, там, где зарегистрированный слизер переписывания отличается от типа поста, вы на самом деле не получаете достоверно
post_type
. например. если ваш тип записи был,myplugin_cars
а перезаписываемый слаг был,cars
и вам нужно его получить,myplugin_cars
то даже это (во избежание ошибок, если текущий запрашиваемый объект не является пользовательским типом записи) все равно завершится ошибкой:Но потому что
is_post_type_archive
это правда, это надежнее:Но подождите, это еще не все ... оказывается, с небольшим тестированием это тоже не так просто ... что если вы находитесь на странице архива таксономии с несколькими типами постов в таксономии ...? Или назначить теги сообщений для пользовательских типов сообщений, кроме сообщений? Или есть на странице архива автора? Дата архива страницы? ... или даже есть комплекс
tax_query
илиmeta_query
дляWP_Query
?Единственный надежный ответ (без тестирования для каждого возможного случая архива) - это зацикливание фактических записей в запросе ... Вот полная функция, с которой я столкнулся, для работы как на единичных, так и на архивных страницах, и позволяющая при желании передать пользовательский объект запроса (или объект сообщения / идентификатор сообщения для отдельных сообщений):
Это надежно (я это сказал?) Вернет массив типов записей, если присутствует более одного, или строку с одним типом записей, если существует только один тип. Все, что вам нужно сделать, это:
Пример использования (просто для удовольствия):
Чтобы увидеть эффект, измените пользовательский тип записи в коде
post
и добавьтеthumbtype-post
атрибут класса к миниатюрам своих сообщений ...источник
Вы можете использовать этот код:
используйте $ posttype_slug var, что вам нужно
источник
$queried_object->query_var['post_type'];
чтобы это работало ...?post_type=post
я опустошу. сравните сget_query_var('post_type');
Вы можете использовать этот код, и этот код работает для меня,
источник
источник