Групповые сообщения по первому письму

Я работаю над сайтом, который использует сообщения как способ управления статьями глоссария, подобными приведенному ниже примеру. Я хотел бы найти способ отображения статей в алфавитном порядке и сгруппировать по выбранной букве (например, букву «F» в примере). Я хотел бы, чтобы процесс был автоматическим.

Пример желаемого результата: http://www.retirementdictionary.com/glossary/f

Может ли кто-нибудь предложить способ сделать это?

Solutions Collecting From Web of "Групповые сообщения по первому письму"

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

во всяком случае, вот что я на самом деле сделал:

/* * Function Create Array of Letters that have post titles (for archive) */ /* When the post is saved, saves our custom data */ function kia_save_first_letter( $post_id ) { // verify if this is an auto save routine. // If it is our form has not been submitted, so we dont want to do anything if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; //check location (only run for posts) $limitPostTypes = array('post'); if (!in_array($_POST['post_type'], $limitPostTypes)) return; // Check permissions if ( !current_user_can( 'edit_post', $post_id ) ) return; // OK, we're authenticated: we need to find and save the data $alphabet = get_option( 'kia_alphabet_archive' ); $alphabet = is_array($alphabet) ? $alphabet : array($alphabet); // pop off first letter of post title $letter = substr($_POST['post_title'], 0, 1); // if it doesn't exist, add it to array if(!in_array($letter, $alphabet)) $alphabet[] = $letter; sort($alphabet); $alphabet = is_array($alphabet) ? array_unique($alphabet) : array($alphabet); update_option( 'kia_alphabet_archive', $alphabet ); } add_action( 'save_post', 'kia_save_first_letter' ); 

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

 //create array from existing posts function kia_run_once(){ $alphabet = array(); $posts = get_posts(array( 'numberposts' => -1 ) ); foreach($posts as $p) : $alphabet[] = strtoupper(substr($p->post_title, 0, 1)); //first letter of post title, capitalized endforeach; sort($alphabet); update_option( 'kia_alphabet_archive', array_unique($alphabet) ); } add_action('init','kia_run_once'); 

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

 /* * Custom Archives by KIA */ function archive_queryvars( $qvars ) { $qvars[] = 'showarchive'; return $qvars; } add_filter('query_vars', 'archive_queryvars' ); function is_custom_archive() { global $wp_query; return isset( $wp_query->query_vars['showarchive'] ); } function archive_search_where( $where ){ global $wpdb; if( is_custom_archive() ) { $char = get_query_var('showarchive'); if ( ! empty($char) ) { $where .= "AND {$wpdb->posts}.post_title LIKE '{$char}%'"; } } return $where; } add_filter('posts_where', 'archive_search_where' ); 

небольшая вспомогательная функция для создания ссылок

 /* * add archive query arg to link */ function get_custom_archive_link($char = '') { $params = array( 'showarchive' => $char, ); return add_query_arg( $params, home_url('/') ); } 

теперь создайте наше меню пользовательского архива

 $alphabet = get_option ('kia_alphabet_archive'); if(count($alphabet)>0){ ?> <div id="archive-menu" class="menu"> <?php for ($i=65; $i < 91; $i++) : $current = (chr($i) == get_query_var('showarchive')) ? "current-menu-item" : "menu-item"; if (is_array($alphabet) && in_array(chr($i), $alphabet)){ ?> <li class="az-char <?php echo $current;?>"> <?php printf('<a href="%s">%s</a>', get_custom_archive_link(chr($i)), chr($i) ) ?> </li> <?php } else { ?> <li class="az-char <?php echo $current;?>"> <?php echo chr($i); ?> </li> <?php } ?> <?php endfor; ?> </div> <?php } 

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


оглядываясь назад, я думаю, что идея таксономии будет намного меньше кода и будет иметь более чистую перезапись, встроенную с самого начала (т. е. … без запросов, даже если они могут быть переписаны … я не знаю, как ). таксономический подход также добавит налоговые данные в БД, тогда как это добавит только один вариант. так компромисс?

* ИЗМЕНИТЬ **

хорошо, я взял удар по таксономическому маршруту, и он немного более изящный, как я ожидал

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

 // Add new taxonomy, NOT hierarchical (like tags) function kia_create_glossary_taxonomy(){ if(!taxonomy_exists('glossary')){ register_taxonomy('glossary',array('post'),array( 'show_ui' => false )); } } add_action('init','kia_create_glossary_taxonomy'); 

аналогичная функция сохранения для хранения наших налоговых данных при сохранении сообщения

 /* When the post is saved, saves our custom data */ function kia_save_first_letter( $post_id ) { // verify if this is an auto save routine. // If it is our form has not been submitted, so we dont want to do anything if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; //check location (only run for posts) $limitPostTypes = array('post'); if (!in_array($_POST['post_type'], $limitPostTypes)) return; // Check permissions if ( !current_user_can( 'edit_post', $post_id ) ) return; // OK, we're authenticated: we need to find and save the data $taxonomy = 'glossary'; //set term as first letter of post title, lower case wp_set_post_terms( $post_id, strtolower(substr($_POST['post_title'], 0, 1)), $taxonomy ); //delete the transient that is storing the alphabet letters delete_transient( 'kia_archive_alphabet'); } add_action( 'save_post', 'kia_save_first_letter' ); 

снова нужно что-то запускать, чтобы схватить старые сообщения, удалите, когда закончите

 //create array from existing posts function kia_run_once(){ $taxonomy = 'glossary'; $alphabet = array(); $posts = get_posts(array('numberposts' => -1) ); foreach($posts as $p) : //set term as first letter of post title, lower case wp_set_post_terms( $p->ID, strtolower(substr($p->post_title, 0, 1)), $taxonomy ); endforeach; } add_action('init','kia_run_once'); 

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

 $taxonomy = 'glossary'; // save the terms that have posts in an array as a transient if ( false === ( $alphabet = get_transient( 'kia_archive_alphabet' ) ) ) { // It wasn't there, so regenerate the data and save the transient $terms = get_terms($taxonomy); $alphabet = array(); if($terms){ foreach ($terms as $term){ $alphabet[] = $term->slug; } } set_transient( 'kia_archive_alphabet', $alphabet ); } ?> <div id="archive-menu" class="menu"> <?php foreach(range('a', 'z') as $i) : $current = ($i == get_query_var($taxonomy)) ? "current-menu-item" : "menu-item"; if (in_array( $i, $alphabet )){ ?> <li class="az-char <?php echo $current;?>"> <?php printf('<a href="%s">%s</a>', get_term_link( $i, $taxonomy ), strtoupper($i) ) ?> </li> <?php } else { ?> <li class="az-char <?php echo $current;?>"> <?php echo strtoupper($i); ?> </li> <?php } ?> <?php endforeach; ?> </div> 

поэтому есть 2 решения. последний получит ваши URL-адреса, чтобы сказать site.com/glossary/l, без каких-либо правил htaccess, чтобы повторно написать запросы vars с вашей стороны. надеюсь, это поможет.

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

Вы можете выбрать более быстрый способ продолжения, Алфавитный плагин для разбивки на страницы