Intereting Posts
Вход / выход WordPress Только одно меню Пользовательские метаботы и поля Multicheck Issue Запрос отношения wordpress ajax Как изменить виджет WordPress по умолчанию, чтобы иметь заголовки в привязанных тегах? Связка несвязанного WordPress с использованием того же memcached не хранит правильно свои данные Показывать и разрешать пользователям редактировать собственные профили Добавить кнопку самозакрывающегося короткого кода в TinyMCE в WP 4.6 Как добавить диапазон дат в woocommerce с кодом Woocommerce: прочитайте , используя резервную копию Изменить URL-адрес для поддомена Пользовательский тип сообщения – одно и то же имя, другой тип сообщения Перенаправить на страницу настроек после установки Как передать аргументы функции обратного вызова виджета панели управления? Вставка содержимого в скрипт с расширенными настраиваемыми полями Если присутствует значение, заказывайте сообщения двумя последовательными настраиваемыми полями

Сортировка запроса по пользовательской дате поля

EDIT: повторить вопрос для большей ясности

Я пытаюсь сортировать по пользовательским данным метаданных, которые я конвертирую в дату с strtotime функции strtotime , но у меня есть некоторые трудности.

Моя главная проблема – это уловка-22 с функцией strtotime . Если я использую strtotime внутри цикла (см. Ниже), я не могу использовать время UNIX для сортировки по дате. Однако, если я обрабатываю strtotime при сохранении (в functions.php), я сталкиваюсь с кучей проблем с обновлением метафайла / не анализом, если пользователь редактирует сообщение или повторно сохраняет.

Есть ли простое решение? Вот код … Я просто хочу заказать эти сообщения в порядке возрастания по пользовательскому полю даты (а не по дате публикации).

EDIT: исправлен массив, добавив мета-ключ – решение все еще ожидается

 <!-- The args --> <?php $args = array( "post_type" => "podcasts", "meta-key" => "_date", "orderby" => "meta_value", "order" => "ASC" ); ?> <!-- The Query --> <?php $podcasts = new WP_Query( $args ); ?> <!-- The Loop --> <?php if ( $podcasts->have_posts() ) : while ( $podcasts->have_posts() ) : $podcasts->the_post(); ?> <!-- Convert Date to Date Stamp --> <?php $podcast_date = get_post_meta($post->ID, '_date', true);?> <?php $fixed_date = strtotime($podcast_date); ?> <!-- Content --> 

EDIT: добавлен соответствующий мета-код (ниже) из functions.php Примечание. Этот код не включает функцию strtotime нигде, потому что я использую ее в шаблоне страницы. Я мог бы включить его здесь, но я не уверен, что делать, чтобы позволить пользователю редактировать сообщения / сохранять. Как только функция strtotime работает при сохранении, не изменит ли она дату метаданных на что-то вроде 1327248252? Если это так, это не будет анализироваться при следующем сохранении сообщения, создавая проблемы.

 // Create podcast Meta boxes function add_podcast_metaboxes() { add_meta_box('podcast_info', 'podcast Information', 'podcast_info', 'podcasts', 'normal', 'high'); } // podcast Meta Box function podcast_info() { global $post; // Noncename needed to verify where the data originated echo '<input id="podcastmeta_noncename" name="podcastmeta_noncename" type="hidden" value="' . wp_create_nonce( plugin_basename(__FILE__) ) . '" />'; // Get the data if its already been entered $week = get_post_meta($post->ID, '_week', true); $date = get_post_meta($post->ID, '_date', true); $description = get_post_meta($post->ID, '_description', true); // Echo out the field echo '<strong>Week</strong><br /><em>What week of the series is this podcast?</em>'; echo '<input class="widefat" name="_week" type="text" value="' . $week . '" />'; echo '<strong>Date</strong><br /><em>Enter the Date the podcast was recorded</em>'; echo '<input class="widefat" name="_date" type="text" value="' . $date . '" />'; echo '<strong>Description</strong><br /><em>Enter the text you would like to display as a description on the media archives list.</em>'; echo '<input class="widefat" name="_description" type="text" value="' . $description . '" />'; } // Save the podcast Meta box Data function save_podcast_meta($post_id, $post) { // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times if ( !wp_verify_nonce( $_POST['podcastmeta_noncename'], plugin_basename(__FILE__) )) { return $post->ID; } // Is the user allowed to edit the post or page? if ( !current_user_can( 'edit_post', $post->ID )) return $post->ID; // OK, we're authenticated: we need to find and save the data // We'll put it into an array to make it easier to loop though. $podcast_meta['_week'] = $_POST['_week']; $podcast_meta['_date'] = $_POST['_date']; $podcast_meta['_thumbnail'] = $_POST['_thumbnail']; $podcast_meta['_seriesimg'] = $_POST['_seriesimg']; $podcast_meta['_description'] = $_POST['_description']; // Add values of $podcast_meta as custom fields foreach ($podcast_meta as $key => $value) { // Cycle through the $podcast_meta array! if( $post->post_type == 'revision' ) return; // Don't store custom data twice $value = implode(',', (array)$value); // If $value is an array, make it a CSV (unlikely) if(get_post_meta($post->ID, $key, FALSE)) { // If the custom field already has a value update_post_meta($post->ID, $key, $value); } else { // If the custom field doesn't have a value add_post_meta($post->ID, $key, $value); } if(!$value) delete_post_meta($post->ID, $key); // Delete if blank } } add_action('save_post', 'save_podcast_meta', 1, 2); // save the custom fields 

EDIT: Ваша проблема заключается в следующем:

Когда вы сохраняете свои метаданные, вы хотите, чтобы дата была сохранена как дата strtotime() , но вы хотите, чтобы она отображала дату в старом формате Ymd . Что вам нужно сделать, это сохранить его как strtotime() а затем при отображении текста на входе вам нужно отменить это strtotime() чтобы он мог отображаться правильно. Вы можете сделать это так:

В вашей функции add_podcasts_metaboxes() измените строку, которая получает дату до этого (при условии, что дата всегда будет отметкой времени UNIX, если есть один набор):

 $date = get_post_meta( $post->ID, '_date', true ); if( $date != '' ) $date = date( 'Ym-d', $date ); 

И когда вы сохраняете мета в save_podcast_meta() , делайте это так, как хотите, с помощью strtotime() :

 $podcast_meta['_date'] = strtotime( $_POST['_date'] ); 

Это превратило бы дату в метку UNIX в базе данных, но с функцией date() вы можете вернуть эту временную метку UNIX в дату, которую вы можете использовать.


Вам нужно указать мета-ключ, а затем meta_value следующим образом:

 <!-- The args --> <?php $args = array( "post_type" => "podcasts", "meta_key" => "some_meta_key", // Change to the meta key you want to sort by "orderby" => "meta_value_num", // This stays as 'meta_value' or 'meta_value_num' (str sorting or numeric sorting) "order" => "ASC" ); ?> <!-- The Query --> <?php $podcasts = new WP_Query( $args ); ?> <!-- The Loop --> <?php if ( $podcasts->have_posts() ) : while ( $podcasts->have_posts() ) : $podcasts->the_post(); ?> <!-- Convert Date to Date Stamp --> <?php $podcast_date = get_post_meta($post->ID, '_date', true);?> <?php $fixed_date = strtotime($podcast_date); ?> <!-- Content --> 

См. Эту страницу кода для справки: http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

EDIT: Я вижу одну (возможную) проблему с вашим кодом мета-кода, который вы только что добавили. Не 100% уверен, хотя!

Попробуйте заменить:

 echo '<input id="podcastmeta_noncename" name="podcastmeta_noncename" type="hidden" value="' . wp_create_nonce( plugin_basename(__FILE__) ) . '" />'; 

с:

 wp_nonce_field( plugin_basename( __FILE__ ), 'podcastmeta_noncename' ); 

Я не уверен, что это решит вашу проблему или сильно изменится, но именно так я использую nonce в своих мета-боксах (хотя я считаю, что есть еще один способ сделать это там, где он избавится от этого Notice если вы для WP_DEBUG установлено значение true).

Ответы выше замечательны. Еще одна полезная тактика, которую следует иметь в виду, состоит в том, что если у вас уже есть массив данных, вы можете сортировать серверную часть (по сравнению с базой данных) с помощью usort , uasort и uksort .

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

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

Я закончил использование http://tablesorter.com/docs и запросил данные метаданных непосредственно в столбцах таблицы. Это работало отлично, а также автоматически сортирует даты соответствующим образом.

Надеюсь это поможет…

Я понимаю, что должен поместить это в свое первоначальное сообщение, но он очень переполнен, и это поддается ответу.

Я ищу что-то вроде этого:

http://www.designhammer.com/blog/sorting-events-date-using-wordpress-custom-post-types

Тем не менее, я не совсем на уровне php, где я могу взять то, что он делает, и применить его к моей ситуации. Похоже, он добавляет некоторую логику в functions.php, где функция strtotime будет срабатывать только тогда, когда время находится в хорошем формате. Это решит мою проблему и позволит мне сортировать на передней панели.

Мысли?