用語の順序は重要ですが、投稿ごとに分類が異なります。だから私は用語がポストごとに表示される順序を設定できるようにしたいです。
私の最初の投稿|タグ:リンゴ、オレンジ、バナナ
他の投稿|タグ:オレンジ、バナナ、りんご
これは投稿ごとに異なるので、 Custom Taxonomy Sort や Taxonomy Terms Order のようなプラグインでサポートされている分類全体の用語順序以外のものが必要です。 ).
これを実装する方法についてのアドバイスを探しています。これが私の現在の考え方の概要です。
remove_meta_box()
を使って標準の分類メタボックスを削除する
ドラッグアンドドロップ(または用語の順序を記述する整数の各用語の隣にある単純なテキスト入力)など、用語の順序付けインターフェイスを含むカスタムメタボックスを追加します。新しいものを削除して追加しますか?**)
Javascriptを使用して、隠されたカスタムフィールド_mytermorder_taxonomynameに、用語IDのカンマ区切りリストを順番に保存します。 (分類ごとに個別のカスタムフィールド、たとえば_mytermorder_category、__ mytermorder_tagsなど)
_taxonomyname_termorderカスタムフィールドのIDをループするカスタム関数my_get_the_terms()
を作成します。投稿に用語があるが_taxonomyname_termorderフィールドがない場合(古い投稿のように)、get_the_terms()を返すだけです。
関連するテーマファイルで、get_the_terms()
または他のネイティブターム関数のインスタンスをmy_get_the_terms()
に置き換えます。
アドバイス、代替案、警告、または関連するスニペットがありますか?どんな考えにも感謝しています。ありがとうございました!
解決策:my_get_the_terms()
の始めに、カスタムフィールドのIDがget_the_termsによって返される用語と一致するかどうかを確認できます。そうでない場合、デフォルトはget_the_termsです。
新しい用語はIDをまだ持っていないため、初回使用時には取り込まれません。うまくいく前に新しい用語を保存する必要があります。 (私はこれで暮らすことができましたが、それは問題です。)
メタボックスは、投稿編集ページが読み込まれたときに正しい順序で用語をリストする必要があります。
**デフォルトのメタボックスでのドラッグアンドドロップによるソートには、すでにadminで利用可能なjQuery UIの.sortableを使用できることを発見しました。非階層的分類法では、それは$('#taxonomyname .tagchecklist').sortable()
です。
私があなたの達成しようとしていることを正確に理解しているかどうかはわかりませんが、現在の投稿に関連する用語の順序を並べ替える方法を概説しました。
echo '<ul id="the-terms">'
$terms = get_the_terms( $post->ID, $taxonomy );
foreach ( $terms as $term ) {
echo '<li class="item" id="term-'.$term->term_id.'">'. $term->name .'</li>';
}
echo '</ul>';
echo '<a href="javascript: void(0); return false;" id="save_term_order" class="button-primary">Update Order</a>';
*注:jQuery UI-Sortableが必要です。
jQuery(document).ready(function() {
// Make the term list sortable
jQuery("#the-terms").sortable({
items: '.item',
placeholder: 'sortable-placeholder',
tolerance: 'pointer',
distance: 1,
forcePlaceholderSize: true,
helper: 'clone',
cursor: 'move'
});
// Save the order using ajax
jQuery("#save_term_order").live("click", function() {
var postID = $("#post_ID").val();
jQuery.post(ajaxurl, {
action:'save_term_order',
cache: false,
post_id: postID,
order: jQuery("#the-terms").sortable('toArray').toString(),
success: ajax_response()
});
return false;
});
});
add_action ( 'wp_ajax_save_term_order', 'term_order_save' );
function term_order_save () {
global $wpdb;
$wpdb->flush ();
$item_id = $_POST['post_id'];
$meta_key = '_term_order';
$order = $_POST[ 'order' ];
$str = str_replace ( "term-", "", $order );
$int = str_replace ( "'", "", $str );
update_post_meta ( $item_id, $meta_key, array ( 'term_order' => $int ) );
$response = '<p>Term order updated</p>';
echo $response;
die(1);
}
これは、直列化された配列としてソートされた順番で用語idのリストを保存します。
_term_order => array(term_order => '123,312,110,34,44,27')
$orderd_terms = get_post_meta ( $post->ID, '_term_order', true );
$terms = $ordered_terms[ 'term_order' ];
$term_ids = explode ( ",", $terms );
for ( $i = 0; $i < count ( $term_ids ); $i ++ ) {
$term = get_term( $term_ids[$i], $taxonomy, OBJECT)
echo $term->name;
}