Intereting Posts
Разница b / w Простой вызов функции и вызов do_action Как безопасно изменить имя настраиваемого типа сообщений? Вывод коротких кодов в верхней части страницы Можно ли не получать уведомления по электронной почте для комментариев? Перенаправление на пользовательский URL после регистрации со страницы с регистрационной формой Замена необработанного запроса базы данных на WP_Query Как написать плагин списка инвентаря, который создает страницы динамических деталей? Возможно ли предотвратить загрузку js wp_editor до загрузки всех других js? Ajaxurl внезапно не определился Как назначить определенным пользователям возможность редактировать определенные страницы / должности / пользовательские типы сообщений Предотвращение использования моего плагина для свободного использования ссылка на библиотеку JS с использованием неработающих wp_enqueue_scripts Нет таблицы пользователей в базе данных WordPress. Точка не добавляется в конце href Перенаправить пользователя после входа / регистрации по всему миру

Получать пользовательский пул сообщений для страницы архива

Как узнать пользовательский пул сообщений, когда я нахожусь на странице архива?

Например, если /products/ запускает шаблон archive-products.php , как (прагматично) я получаю пул типа сообщения?

благодаря

Solutions Collecting From Web of "Получать пользовательский пул сообщений для страницы архива"

Чтобы получить текущий тип сообщения, используйте get_post_type() . Затем спросите get_post_type_object() для всех необходимых вам данных, например slug:

 $post_type = get_post_type(); if ( $post_type ) { $post_type_data = get_post_type_object( $post_type ); $post_type_slug = $post_type_data->rewrite['slug']; echo $post_type_slug; } 

Я использую это вне цикла на шаблоне archive.php, чтобы получить, какой пользовательский пост-архив я включен.

Это комбинация методов, которые рекомендуются как @toscho, так и @Rarst:

 $post_type = get_queried_object(); echo $post_type->rewrite['slug']; 

Обновление: @majick отметил, что это работает, только если вы установили перезапись для вашего CPT. Перезапись slug является необязательной при регистрации CPT и по умолчанию используется post_type, если не задана.

t следует отметить, что если has_archive имеет значение true при регистрации типа пользовательской публикации, архив типа post /cptslug/ будет внутренне переписан на ?post_type=cptslug . Это также означает, что is_post_type_archive() вернет true.

К сожалению, если зарегистрированная переписывающая пробка отличается от типа сообщения, вы на самом деле не надежно получаете post_type . например. если ваш тип сообщения был myplugin_cars а ваш перезаписываемый myplugin_cars был cars и вам нужно было получать myplugin_cars тогда даже это (чтобы предотвратить ошибки, если текущий запрошенный объект не является настраиваемым типом сообщения) все равно будет работать:

 $queryobject = get_queried_object(); if (has_property('rewrite',$queryobject)) { if (isset($queryobject->rewrite['slug'])) { $posttype = $queryobject->rewrite['slug']; } } 

Но поскольку is_post_type_archive верно, это более надежно:

 if (is_post_type_archive()) { $posttype = get_query_var('post_type'); // which is basically the same as: // global $wp_query; // $posttype = $wp_query->query_vars['post_type']; } else ($posttype = 'post';} 

Но держитесь, есть еще … получается с небольшим тестированием, это действительно не так просто … что, если вы находитесь на странице архива таксономии с несколькими типами сообщений в таксономии ..? Или назначить почтовые теги для персонализированного типа сообщения, кроме сообщения? Или на странице архивного архива? Страница архива даты? … или даже имеет сложный tax_query или meta_query для WP_Query ?

Единственный надежный ответ (без тестирования для каждого возможного архивного случая) – это зацикливание фактических сообщений в запросе … Вот полная функция, которую я придумал для работы как с сингулярными, так и с архивными страницами, а также с возможностью пользовательский объект запроса (или post post / post ID для отдельных сообщений):

 function get_current_post_types($object=null) { // if a numeric value passed, assume it is a post ID if ( ($object) && (is_numeric($object)) ) {$object = get_post($object);} // if an object is passed, assume to be a post object if ( ($object) && (is_object($object)) ) {return get_post_type($object);} // standard single post type checks if (is_404()) {return '';} // update: removed this check, handled by is_singular // if (is_single()) {return 'post';} if (is_page()) {return 'page';} if (is_attachment()) {return 'attachment';} if (is_singular()) {return get_post_type();} // if a custom query object was not passed, use $wp_query global if ( (!$object) || (!is_object($object)) ) { global $wp_query; $object = $wp_query; } if (!is_object($object)) {return '';} // should not fail // if the post_type query var has been explicitly set // (or implicitly set on the cpt via a has_archive redirect) // ie. this is true for is_post_type_archive at least // $vqueriedposttype = get_query_var('post_type'); // $wp_query only if (property_exists($object,'query_vars')) { $posttype = $object->query_vars['post_type']; if ($posttype) {return $posttype;} } // handle all other cases by looping posts in query object $posttypes = array(); if (method_exists($object,'found_posts')) { if ($object->found_posts > 0) { $queriedposts = $object->posts; foreach ($queriedposts as $queriedpost) { $posttype = $queriedpost->post_type; if (!in_array($posttype,$posttypes)) {$posttypes[] = $posttype;} } if (count($posttypes == 1)) {return $posttypes[0];} else {return $posttypes;} } } return ''; // nothin to see here } 

Это будет надежно (я так сказал?) Возвращает массив типов сообщений, если присутствует более одного, или строка с единственным типом сообщения, если есть только один тип. Все, что вам нужно сделать, это:

 $posttypes = get_current_post_types(); // or pass a post ID $posttypes = get_current_post_types($postid); // or pass a post object $posttypes = get_current_post_types($post); // or pass a custom query - that has been run $posttypes = get_current_post_types($query); 

Пример использования (просто для удовольствия):

 add_filter('the_posts','myplugin_fading_thumbnails',10,2); function myplugin_fading_thumbnails($posts,$query) { if (!is_archive()) {return $posts;} $cptslug = 'myplugin_slug'; $dosomethingcool = false; $posttypes = get_current_post_types($query); if ( (is_array($posttypes)) && (in_array($cptslug,$posttypes)) ) {$dosomethingcool = true;} elseif ($cptslug == $posttypes) {$dosomethingcool = true;} if ($dosomethingcool) { global $fadingthumbnails; $fadingthumbnails = $cptslug; if (!has_action('wp_footer','myplugin_cpt_script')) { add_action('wp_footer','myplugin_cpt_script'); } } function myplugin_cpt_script() { global $fadingthumbnails; echo "<script>var thumbnailclass = 'img.thumbtype-".$fadingthumbnails."'; function fadeoutthumbnails() {jQuery(thumbnailclass).fadeOut(3000,fadeinthumbnails);} function fadeinthumbnails() {jQuery(thumbnailclass).fadeIn(3000,fadeoutthumbnails);} jQuery(document).ready(function() {fadeoutthumbnails();}); </script>"; } return $posts; } 

Чтобы увидеть эффект, измените тип персонализированного сообщения в коде для post и добавьте thumbtype-post класса thumbtype-post для ваших миниатюр изображений …

Ответы сбивают с толку. И, возможно, я тоже, но заголовок вопроса:

Получать пользовательский пул сообщений для страницы архива

Если вы имеете в виду почтовую страницу архива пост-типа , а когда is_post_type_archive() возвращает true , вы хотите, чтобы slug отвечал на текущий архив просмотра:

 /* returns /products/ */ $responding_name = str_replace(get_home_url(), '', get_post_type_archive_link(get_query_var('post_type'))); /* continue to get 'products' without slug slashes */ $responding_name = str_replace('/', '', $responding_name); 

– КОНЕЦ ОТВЕТСТВА ВОПРОСА –

Объяснение:

Вы не можете полагаться на зарегистрированный слизень . WordPress тоже. Например, при вызове get_post_type_archive_link() WordPress проверяет текущие правила перезаписи для вашей установки .

Где бы вы ни находились, внутри или снаружи, текущий архив или отдельный пост, get_post_type_archive_link() механизм get_post_type_archive_link() . (Разрешены постоянные ссылки.)

Соображения:

Как уже упоминалось здесь, тип сообщения (post) в текущем запросе может быть array . Вы можете пойти дальше с вашими намерениями с фильтром из типа сообщения, который вы ищете, например:

 $post_type = get_query_var('post_type'); if(is_array($post_type)) $post_type = reset($post_type); 

или

 if(isset($post_types[0])) $post_type = $post_types[0]; 

Другая точка зрения:

Пример Woocommerce, зарегистрирован с объектом типа post-products, но на самом деле использует перезаписанное имя правила (магазин):

 /* returns shop */ $responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product'))); 

Марк, я использую $responding_name , потому что цели могут отличаться. Почтового архива не существует, его просто URL.

Вы можете использовать этот код:

 $queried_object = get_queried_object(); $posttype_slug = $queried_object->query_var; echo $posttype_slug; 

используйте $ posttype_slug var, что вам нужно

Вы можете использовать этот код, и этот код работает для меня,

  $ t_slug = get_query_var ('term');
 if( get_post_type( get_the_ID() ) == 'projects' ) { //enter code for this post type }