web-dev-qa-db-ja.com

カスタムフィールド日付によるクエリの並べ替え

編集:より明確にするために質問を書き換えた

strtotime関数を使用して日付に変換しているカスタムメタボックスデータでソートしようとしていますが、いくつかの問題があります。

私の主な問題はstrtotime関数を使ったcatch-22にあるようです。ループ内でstrtotimeを使用すると(下記参照)、日付でソートするのにUNIXの時刻を使用することはできません。しかし、(functions.phpで)保存時にstrtotimeを処理すると、ユーザーが投稿を編集したり再保存したりするとメタボックスが更新されたり解析されなかったりするという問題にぶつかります。

これに対する簡単な解決策はありますか?ここにコードがあります...私はカスタム投稿日フィールドで昇順でこれらの投稿を注文したいだけです(投稿日ではありません)。

編集:メタキーを追加することで配列を修正 - 解決策はまだ保留中 /

<!-- 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 -->

編集: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
4
timshutes

EDIT:あなたの問題はこれです:

メタデータを保存するときに、日付をstrtotime()日付として保存する必要がありますが、古いY-m-d形式で日付を表示する必要があります。あなたがする必要があるのは、それをstrtotime()として保存することです。そして、入力にテキストを表示するとき、あなたはそれを正しく表示できるようにstrtotime()soを逆にする必要があります。次のようにできます:

add_podcasts_metaboxes()関数で、日付を取得する行を次のように変更します(セットがある場合、日付は常にUNIXタイムスタンプであると仮定します)。

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

また、save_podcast_meta()にメタを保存するときは、strtotime()を使用して好きなように実行します。

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

これにより、日付がデータベース内のUNIXタイムスタンプに変換されますが、date()関数を使用すると、そのUNIXタイムスタンプを使用可能な日付に戻すことができます。


メタキーを指定し、orderby 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:追加したメタボックスコードに1つ(可能性のある)問題があります。しかし、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を使用する方法です(ただし、そのNoticeWP_DEBUGがtrueに設定されている場合)。

6
Jared

あなたは私が抱えているのと同じような問題に直面しています、そして私はあなたの提供された解決策を通して働きかけることを試みるか結果なしで。

私は http://tablesorter.com/docs を使用し、メタボックスのデータをテーブルの列に直接問い合わせました。これは完璧に機能し、また自動的に日付を適切にソートします。

お役に立てれば...

1
Dan

上記の答えは素晴らしいです。もう1つ覚えておくと便利な方法は、すでにデータの配列がある場合は、サーバーサイド(データベースサイドに対して) PHPのusortuasort、およびuksort を並べ替えることができるということです。

それには、最初の引数として配列を渡し、2番目の引数として後でコールバックとして使用される関数の名前をメソッドに渡します。カスタムレシピでソートするには、その関数に1、0、または-1を返させるだけです。

1
editor

私はこれを私の最初の投稿に入れるべきだと思います - しかしそれは非常に混雑しています、そしてこれは答えに向いています。

私はこのようなものを探しています:

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

しかし、私は彼がしていることを理解してそれを私の状況に適用することができるphpレベルではありません。彼はfunctions.phpにロジックを追加しているように思えます。ここでstrtotime関数は時間が良いフォーマットである場合にのみ起動します。それは私の問題を解決し、私がフロントエンドでソートすることを可能にするでしょう。

考えですか?

0
timshutes