Intereting Posts
Пустая страница при сохранении изменений в сообщении Добавить функцию для экземпляров пользовательского текста в нескольких идентификаторах категорий, которые будут отображаться в сообщении если плагин активен? проверить, включен ли плагин или нет? как группировать персонализированные сообщения типа по пользовательским правилам таксономии Текстовый URL-адрес WordPress Post в заголовке Переписывать URL (я думаю?) Переписать параметр числового идентификатора для иерархического пользовательского типа сообщения Как менеджер магазина может просматривать веб-сайт, находясь под техобслуживанием? Ошибка HTTP при загрузке видеофайла mp4 Переменная в массиве не работает Удаление WordPress с помощью сокращенного кода получить персонализированный пост по специальной категории Найти ещё сообщения от TheGOLDskull Как загрузить мультимедийный ресурс для мультимедиа в wordpress WordPress перезаписывает UNC

Условный двухуровневый выпадающий фильтр для настраиваемого типа сообщений

Я создал настраиваемый тип сообщения и таксономию. Тип сообщения называется Local Services, а иерархическая таксономия называется областями. Регионы имеют дочерние категории, называемые зонами. Я создал настраиваемую страницу для отображения моих результатов. Пока мне удалось отобразить последние 10 сообщений. Но мне нужно сделать один результат на этой странице. Для этого мне нужно иметь раскрывающееся меню регионов, а затем, в соответствии с тем, какой регион выбран, это отобразило бы второе раскрывающееся меню дочерних областей. Затем пользователь выделит одну область.

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

Это звучит относительно просто, и я смотрел на подобные вопросы здесь, но не могу найти решение.

Может ли кто-нибудь помочь?


Это то, что у меня есть до сих пор в моем настраиваемом шаблоне страницы, который отображает единственный результат (самый последний). Но я хотел бы, чтобы на моей странице отображался выпадающий список регионов, а другой – связанные с ними области, поэтому пользователь получит один результат, отображающий выбранную область. На странице не должно отображаться какая-либо пользовательская информация о сообщении, пока пользователь не сделает эти 2 варианта.

$args = array( 'post_type' => 'local_services', 'posts_per_page' => 1 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '<div class="entry-content">'; the_content(); echo '</div>'; endwhile; 

ОБНОВЛЕНИЕ: 12 ДЕКАБРЯ

Мой заказ и код таксономии:

 <?php function create_post_type() { register_post_type( 'local_services', array( 'labels' => array( 'name' => __( 'Local Services' ), 'singular_name' => __( 'Local Service' ), 'edit_item' => __( 'Edit Local Service' ), 'update_item' => __( 'Update Local Service' ), ), 'public' => true, 'menu_position' => 5, 'rewrite' => array('slug' => 'local-services') ) ); } add_action( 'init', 'create_post_type' ); function region_taxonomy() { register_taxonomy( 'region', 'local_services', array( 'hierarchical' => true, 'label' => 'Region', 'query_var' => true, 'rewrite' => array('slug' => 'region') ) ); } add_action( 'init', 'region_taxonomy' ); ?> 

ОБНОВЛЕНИЕ: 18 ДЕКАБРЯ

Я просмотрел wp_dropdown_categories и нашел код для его настройки. Я решил пойти на более простой вариант только одного выпадающего списка вместо двух. Я создал новую персонализированную службу типа сообщений и новую область таксономии.

Я поставил новый код на боковой панели:

  <?php $categories = get_categories('taxonomy=area'); $select = "<select name='cat' id='cat' class='postform'>n"; $select.= "<option value='-1'>Select your local area</option>n"; foreach($categories as $category){ if($category->count > 0){ $select.= "<option value='".$category->slug."'>".$category->name."</option>"; } } $select.= "</select>"; echo $select; ?> <script type="text/javascript"><!-- var dropdown = document.getElementById("cat"); function onCatChange() { if ( dropdown.options[dropdown.selectedIndex].value != -1 ) { location.href = "<?php echo home_url();?>/services/"+dropdown.options[dropdown.selectedIndex].value+"/"; } } dropdown.onchange = onCatChange; --></script> 

Я также создал собственный шаблон «single-services.php», чтобы отобразить результат. Поскольку мне нужен только один результат для каждого запроса, это отлично работает.

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

Чтобы заставить его работать как фактический выбор, переданный запросу, выпадающее меню должно быть частью формы. Таким образом, переменная, построенная по методу формы, может использоваться для выполнения запроса. Я выбрал POST как метод здесь, GET будет другой возможностью, взгляните на мой связанный ответ, чтобы получить немного больше информации об этом. Метод построения формы – это адаптация этого примера на wp_dropdown_categories() codex. Ключ здесь – отключить эхо и адаптировать выбранный выход. Делая это таким образом, мы можем отправить кнопку с меньшей формой, но если javascript недоступен, у нас есть резерв, чтобы показать кнопку – кнопка завернута в теги noscript .

Для этой настройки необходимы несколько шагов. Нижеприведенное решение работает с иерархической таксономией, чтобы проводить различие между регионами и районами – в случае таможенной таксономии вы должны использовать параметр taxonomy . На первом этапе мы хотели убедиться, что раскрывающийся список регионов показывает только верхний уровень иерархии, это делается с помощью hierarchical параметров и depth . Кроме того, существуют условные состояния для случаев »не выбрана опция« и »выбрана опция« – parameters show_option_none и selected , в зависимости от $_POST['region'] .

Второй раскрывающийся список области отображается только в том случае, если ранее был выбран регион. В любом случае это было бы бесполезно, потому что его содержимое определяется первым раскрывающимся регионом. Для этого child_of параметр child_of который, конечно, возвращает это в выбранную область, сохраненную в $_POST['region'] . Другое дело – убедиться, что мы сохраняем информацию о регионе, поскольку скрытый ввод является частью второй формы. Последний уверяет, что мы проходим через область, пока мы просто меняем области.

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

Код:

Часть 1:

  <form method="POST" action=""> <div> <?php $args = array( // hierarchical is needed to define depth 'hierarchical' => 1, // regions are the top level in a hierarchical taxonomy 'depth' => 1, 'orderby' => 'name', // we're not echoing, because we want to construct a no button solution 'echo' => 0, 'taxonomy' => 'regions', // this leads to variable name $_POST['region'] 'name' => 'region' ); if( ! isset($_POST['region']) ): // if no region was selected prior we show this by default $args['show_option_none'] = 'Select Region'; else: // otherwise make sure the region form shows what was selected before $args['selected'] = $_POST['region']; endif; // we're putting the dropdown output into a variable $region = wp_dropdown_categories( $args ); // this enables the buttonless js possibility $region = preg_replace("#<select([^>]*)>#", "<select$1 onchange='return this.form.submit()'>", $region); // now echo the dropdown output echo $region; // the »<noscript>...</noscript> part makes sure there is a fallback in case there is no js ?> <noscript> <div> <input type="submit" value="region" /> </div> </noscript> </div> </form> 

Часть 2:

  <?php // the area dropdown is only shown if a region was selected if( isset($_POST['region']) && $_POST['region'] ): ?> <form method="POST" action=""> <?php // we add a hidden input to hand over the region selected ?> <input type="hidden" name="region" value="<?php echo $_POST['region'] ?>"> <div> <?php $args = array( // the areas to show are children of the prior selected region 'child_of' => $_POST['region'], 'hide_if_empty' => true, 'orderby' => 'name', 'echo' => 0, 'taxonomy' => 'regions', 'name' => 'area' ); if( ! isset($_POST['area']) ): $args['show_option_none'] = 'Select Area'; endif; $area = wp_dropdown_categories( $args ); $area = preg_replace("#<select([^>]*)>#", "<select$1 onchange='return this.form.submit()'>", $area); echo $area; ?> <noscript> <div> <input type="submit" value="area" /> </div> </noscript> </div> </form> <?php endif; ?> 

Часть 3:

  <?php // we're only performing a query if both a region and an area have been selected if( isset($_POST['region']) && isset($_POST['area']) && $_POST['region'] && $_POST['area'] ): $args = array( 'post_type' => 'local_services', // this assures the post is selected by the area selected 'cat' => $_POST['area'], 'posts_per_page' => 1 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '<div class="entry-content">'; the_content(); echo '</div>'; endwhile; // show conditional information according to the step we're at elseif( isset($_POST['region']) && ! isset($_POST['area']) && $_POST['region'] ): echo 'Please select an area'; else: echo 'Please select a region'; endif; ?> 

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


Примечание. Я протестировал это и работал аналогично этому, поэтому я не уверен, что проблема, с которой сталкивается OP, была. Насколько мне известно, это работает.


Изменить: в ответ на комментарий

Вы отлаживаете ? У вас могут быть конфликтующие запросы vars здесь, потому что ваше имя таксономии – это фактически «регион», а не «регионы». Вместо того, чтобы использовать

 'query_var' => true 

вы можете попробовать

 'query_var' => 'regions' 

Или вы даете форме другое name затем region , не забудьте изменить все связанные переменные $_POST соответственно.

Код из ialocin работает очень хорошо, но если вы хотите использовать пользовательскую таксономию, то это должно быть примерно так:

Часть 1:

  <form method="POST" action=""> <div> <?php $args = array( // hierarchical is needed to define depth 'hierarchical' => 1, // regions are the top level in a hierarchical taxonomy 'depth' => 1, 'orderby' => 'name', // we're not echoing, because we want to construct a no button solution 'echo' => 0, 'taxonomy' => 'regions', // this leads to variable name $_POST['region'] 'name' => 'region' ); if( ! isset($_POST['region']) ): // if no region was selected prior we show this by default $args['show_option_none'] = 'Select Region'; else: // otherwise make sure the region form shows what was selected before $args['selected'] = $_POST['region']; endif; // we're putting the dropdown output into a variable $region = wp_dropdown_categories( $args ); // this enables the buttonless js possibility $region = preg_replace("#<select([^>]*)>#", "<select$1 onchange='return this.form.submit()'>", $region); // now echo the dropdown output echo $region; // the »<noscript>...</noscript> part makes sure there is a fallback in case there is no js ?> <noscript> <div> <input type="submit" value="region" /> </div> </noscript> </div> </form> 

Часть 2:

  <?php // the area dropdown is only shown if a region was selected if( isset($_POST['region']) && $_POST['region'] ): ?> <form method="POST" action=""> <?php // we add a hidden input to hand over the region selected ?> <input type="hidden" name="region" value="<?php echo $_POST['region'] ?>"> <div> <?php $args = array( // the areas to show are children of the prior selected region 'child_of' => $_POST['region'], 'hide_if_empty' => true, 'orderby' => 'name', 'echo' => 0, 'taxonomy' => 'regions', 'name' => 'area' ); if( ! isset($_POST['area']) ): $args['show_option_none'] = 'Select Area'; endif; $area = wp_dropdown_categories( $args ); $area = preg_replace("#<select([^>]*)>#", "<select$1 onchange='return this.form.submit()'>", $area); echo $area; ?> <noscript> <div> <input type="submit" value="area" /> </div> </noscript> </div> </form> <?php endif; ?> 

Часть 3 (здесь внесены изменения):

  <?php // we're only performing a query if both a region and an area have been selected if( isset($_POST['region']) && isset($_POST['area']) && $_POST['region'] && $_POST['area'] ): $args = array( 'post_type' => 'local_services', // this assures the post is selected by the area selected // usage of custom taxononmy 'tax_query' => array ( array ( 'taxonomy' => 'bundesland', 'field' => 'term_id', 'terms' => array($_POST['area']), ), ), 'posts_per_page' => 1 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '<div class="entry-content">'; the_content(); echo '</div>'; endwhile; // show conditional information according to the step we're at elseif( isset($_POST['region']) && ! isset($_POST['area']) && $_POST['region'] ): echo 'Please select an area'; else: echo 'Please select a region'; endif; ?>