Intereting Posts
Есть ли is_child () в wp 3.5.1? проблема кодирования символов в пользовательском шаблоне Невозможно загрузить результаты поиска с помощью ajax после того, как wp_insert_post нужно получить идентификатор сообщения Возможность загрузки только после отправки по электронной почте Используя wp_trim_excerpt, чтобы получить the_excerpt () вне цикла Пользовательский столбец редактирования столбца – категория, не отображающая Смещение сообщения в цикле с использованием PageNavi Plug-in Как использовать fetch_feed () для загрузки большого количества сообщений? Параметры Framework не правильно сохраняют параметры Как добавить дополнительную кнопку поиска? Как отменить `wp_print_scripts`? Где файлы, загруженные через Media Manager, сохраняются в MU? показывать значения метаданных посетителям, которые собираются через форму согласия Загрузка частичных шаблонов с помощью AJAX / PJAX

Сортировка основного запроса в подкатегориях / терминах?

У меня есть пользовательский пост «загрузки» с его собственной таксономией. Таксономия имеет 2 основных условия. Один из 2, имеет 4 суб-термина. В настоящее время я использую систему шаблонов wp для получения стандартного wpquery родительского термина на странице taxonomy-taxonomyname-termname.php . До сих пор все прекрасно.

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

Обычно я выполняю пользовательский запрос. Но с этого момента я пытаюсь воспользоваться системой запросов wp по умолчанию, я бы хотел использовать только цикл. Есть ли способ, чтобы должности были сгруппированы по суб-термину?

Solutions Collecting From Web of "Сортировка основного запроса в подкатегориях / терминах?"

Всегда здорово, если кто-то хочет использовать лучшие, более правильные и эффективные способы добиться успеха. Для достижения того, что вам нужно, не сложно.

WORKSFLOW:

  • Используйте usort() чтобы создать свой собственный порядок сортировки

  • Используйте фильтр the_posts для сортировки и возврата отсортированного массива сообщений непосредственно перед the_posts цикла

  • Внутри цикла все, что вам нужно сделать, это сравнить предыдущие должности и текущие условия сообщения и действовать на этом

КОД:

Давайте посмотрим на код:

Сначала выполните сортировку с использованием usort() и фильтра the_posts : ( Требуется хотя бы PHP 5.4+. Если у вас нет хотя бы PHP 5.4, тогда вы обязательно столкнетесь с проблемами безопасности. Также обратите внимание, что весь код непроверенный и может быть ошибкой )

 add_filter( 'the_posts', function ( $posts, $q ) { if ( $q->is_main_query() // Target the main query only && $q->is_tax() // Change to target only specific term or taxonomy ) { /** * We will now sort the $posts array before the loop executes. We will use usort() * * There is a bug in usort causing the following error: * usort(): Array was modified by the user comparison function * @see https://bugs.php.net/bug.php?id=50688 * This bug has yet to be fixed, when, no one knows. The only workaround is to suppress the error reporting * by using the @ sign before usort */ @usort( $posts, function ( $a, $b ) { /** * Get the respective terms from the posts * We will use the first term's name */ $array_a = get_the_terms( $a->ID, 'TAXONOMY_NAME_HERE' )[0]->name; $array_b = get_the_terms( $b->ID, 'TAXONOMY_NAME_HERE' )[0]->name; // Sort by term name, if they are the same, sort by post date if ( $array_a != $array_b ) { return strcasecmp( $array_a, $array_b ); // Sort terms alphabetically, ascending // return strcasecmp( $array_b, $array_a ); // Sort terms alphabetically, descending } else { return $a < $b; // Sort by date if terms are the same. Change < to > if the post date order is incorrect } } } }, 10, 2 ); 

Это должно позаботиться о сортировке. Как я уже сказал, просто убедитесь, что сортировка даты верна в пределах условий. Если нет, просто измените < на >

Теперь мы можем отображать имена терминов внутри цикла. При необходимости отрегулируйте и измените

 if ( have_posts() ) { // Define variable to hold previous post term name $term_string = ''; while ( have_posts() ) { the_post(); global $post; // Get the post terms. Use the first term's name $term_name = get_the_terms( $post->ID, 'TAXONOMY_NAME_HERE' )[0]->name; // Display the taxonomy name if previous and current post term name don't match if ( $term_string != $term_name ) echo '<h2>' . $term_name . '</h2>'; // Add styling and tags to suite your needs // Update the $term_string variable $term_string = $term_name; // REST OF YOUR LOOP } } 

Если я правильно понял вопрос, вы хотите создать что-то вроде этого:

Подпункт 1

Сообщение 1

Сообщение 2

[…]

Подпункт 2

Сообщение 1

Сообщение 2

[…]

Может быть, более эффективный способ, чем то, что я собираюсь вам рассказать, но я бы попробовал что-то вроде этого:

Сначала создайте массив для хранения отсортированных сообщений.

 $sortedPosts = array(); 

Затем создайте массив для каждого из ваших суб-терминов.

 foreach ($subTerms as $subTerm) { $sortedPosts[$subTerm] = array(); } 

Прокрутите сообщения в своем запросе и отсортируйте их на основе назначенного термина.

 if (have_posts()) { while (have_posts()) { the_post(); $postTerms = get_terms('taxonomyName', array('fields' => 'name')); if (is_array($postTerms)) { foreach ($subTerms as $subTerm) { if (in_array($subTerm, $postTerms)) { global $post; $sortedPosts[$subTerm][] = $post; /* This grabs the array stored at $sortedPosts[$subTerm] and then inserts the current post at the end of it. */ } } } } } 

После того, как все сообщения отсортированы, прокрутите отсортированный массив, чтобы распечатать дисплей.

 foreach ($subTerms as $subTerm) { $myPosts = $sortedPosts[$subTerm]; echo '<h1>' . $subTerm . '</h1>'; foreach ($myPosts as $currentPost) { global $post; $post = $currentPost; // Enter post display stuff here } echo '<hr>' } 

Хорошо, спасибо всем за ваши хорошие ответы. Во всяком случае, мне нужна большая гибкость, поэтому я не использовал шаблоны wp template auto-sudars …

Поэтому этот ответ не имеет строгого отношения к моему собственному первоначальному вопросу, но я думаю, что он тоже может помочь людям.

Я создал настраиваемую функцию, которая извлекает набор пользовательских сообщений, формируя определенную пользовательскую таксономию и необязательный родительский термин. Если родительский код передан, возвращаемые сообщения будут принадлежать дочерним родителям-родителям. Это код:

 // $post_type: string // $taxonomy: string // $parent_term: string (slug) || int (term_id) // retrieves posts of a specific post_type and taxonomy, sorted by term function get_taxonomy_posts($post_type, $taxonomy, $parent_term = ''){ if(!$post_type || !$taxonomy) return false; global $wpdb; //if $parent_term is defined and is not an integer then should be a slug, so let's get its id if(!empty($parent_term) && !is_int($parent_term)){ $parent_data = get_term_by('slug',$parent_term,$taxonomy); $parent_term = $parent_data->term_id; } $term_ids = get_terms($taxonomy, array( 'parent' => $parent_term, 'fields' => 'ids' )); if(is_wp_error($term_ids)) return false; $term_ids_str = implode(',',$term_ids); // NOTE: terms.term_order gets added to tables by this plugin: // http://wordpress.org/plugins/taxonomy-terms-order/ $query = $wpdb->prepare( "select p.ID, p.post_title, p.post_content, p.post_excerpt, t.term_id, t.term_order, t.name as term_name, t.slug as term_slug, tt.count from " . $wpdb->prefix . "posts p inner join " . $wpdb->prefix . "term_relationships rel on p.ID = rel.object_id inner join " . $wpdb->prefix . "term_taxonomy tt on tt.term_taxonomy_id = rel.term_taxonomy_id inner join " . $wpdb->prefix . "terms t on tt.term_id = t.term_id where p.post_type = %s and p.post_status = %s and t.term_id in (" . $term_ids_str . ") order by t.term_order, p.menu_order" ,$post_type ,"publish" ); $records = $wpdb->get_results($query); $posts_array = array(); foreach($records as $record){ $term_name = $record->term_name; if(!key_exists($term_name, $posts_array)) $posts_array[$term_name] = array(); $posts_array[$term_name][] = $record; } return $posts_array; }//end get taxonomy_posts 

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

  object(stdClass)#2308 (9) { ["ID"]=> string(3) "269" ["post_title"]=> string(26) "title" ["post_content"]=> string(0) "content" ["post_excerpt"]=> string(0) "excerpt" ["term_id"]=> string(3) "803" ["term_order"]=> string(1) "2" ["term_name"]=> string(27) "term name" ["term_slug"]=> string(26) "term-slug" ["count"]=> string(1) "3" } 

SIDE NOTE 1: в настоящее время я использую плагины для порядка таксономии и поэтому в запросе я заказываю термины в пользовательском поле term_order. Опять же, если вы не используете плагин, просто измените полученные поля и упорядочите предложение, как вы предпочитаете.

ПРИМЕЧАНИЕ 2: Вместо таксономии-taxonomyname-termname.php, теперь я в основном использую фиктивную страницу и применяю специальный шаблон (я имею в виду /* Template Name: [name] */ ): это не обязательно, но я делаю он должен иметь основной запрос wp, просто сделать простой почтовый запрос вместо своего рода дублированным термином.

Надеюсь, поможет!