web-dev-qa-db-ja.com

投稿ごとに用語の順序を制御する

用語の順序は重要ですが、投稿ごとに分類が異なります。だから私は用語がポストごとに表示される順序を設定できるようにしたいです。

  • 私の最初の投稿|タグ:リンゴ、オレンジ、バナナ

  • 他の投稿|タグ:オレンジ、バナナ、りんご

これは投稿ごとに異なるので、 Custom Taxonomy SortTaxonomy Terms Order のようなプラグインでサポートされている分類全体の用語順序以外のものが必要です。 ).

これを実装する方法についてのアドバイスを探しています。これが私の現在の考え方の概要です。

カスタムフィールドを使用したポストごとの用語順

  1. remove_meta_box()を使って標準の分類メタボックスを削除する

  2. ドラッグアンドドロップ(または用語の順序を記述する整数の各用語の隣にある単純なテキスト入力)など、用語の順序付けインターフェイスを含むカスタムメタボックスを追加します。新しいものを削除して追加しますか?**)

  3. Javascriptを使用して、隠されたカスタムフィールド_mytermorder_taxonomynameに、用語IDのカンマ区切りリストを順番に保存します。 (分類ごとに個別のカスタムフィールド、たとえば_mytermorder_category、__ mytermorder_tagsなど)

  4. _taxonomyname_termorderカスタムフィールドのIDをループするカスタム関数my_get_the_terms()を作成します。投稿に用語があるが_taxonomyname_termorderフィールドがない場合(古い投稿のように)、get_the_terms()を返すだけです。

  5. 関連するテーマファイルで、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()です。

4
supertrue

私があなたの達成しようとしていることを正確に理解しているかどうかはわかりませんが、現在の投稿に関連する用語の順序を並べ替える方法を概説しました。

順序メタボックスという用語のHTML:

 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>';

上記のリストをソート可能にし、ajaxを使用して注文を保存するためのJavaScript。

*注: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; 
    });   
 });

カスタムフィールドとして注文を保存するためのWordPressのAjax関数:

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;
  }
3
Chris_O