web-dev-qa-db-ja.com

カスタム分類法 - カスタムソート可能列

私はあなたが都市を追加することができる「都市」と呼ばれるカスタム分類法を作成し、2つのオプションを持つカスタムフィールド(ラジオボタン)を追加しました。すべてが大丈夫です、私はその価値と他のものを手に入れることができます。

後で私はソート可能な列を追加するというアイデアを思いつきました( 'Name'、 'Slug'、 'Posts'など)。その列を作成し、並べ替え可能にしましたが、それらの都市をそのカスタムフィールドで並べ替える方法がわかりませんか。今は名前でソートしています。カスタムフィールドではうまく動作しないからです。

何か手がかりやヒントはありますか?

1
mihajlo

私は同様の問題を抱えていて、それをどうにか解決しました。私の場合、カスタム分類法issueがあります。これには、 ACF PRO プラグインを使用した必須日付ピッカーカスタムフィールドが含まれています - フィールド名はissue_dateです。 issue編集画面のwp-admin/edit-tags.php?taxonomy=issueに日付列を追加し、管理者が問題を日付順にソートできるようにしたいと思いました。

@aifrimが上で答えたように私はpre_get_postsにフックしようとしました、しかしそのアクションは編集スクリーンに分類学用語をロードするときに実行される質問の一部ではありません。さらに、分類学用語はWordPressデータベースにネイティブメタデータを持たないので、私のメタデータは別のテーブルにまとめて格納されているのでmeta_queryは機能しません。楽しいカーブボール。

ステップ1:新しい列を作成します。最初は空です。

function create_date_column_for_issues($issue_columns) {
  $issue_columns['date'] = 'Date';
  return $issue_columns;
}
add_filter('manage_edit-issue_columns', 'create_date_column_for_issues');

ステップ2:新しい列を作成する

function populate_date_column_for_issues($value, $column_name, $term_id) {
  $issue = get_term($term_id, 'issue');
  $date = DateTime::createFromFormat('Ymd', get_field('issue_date', $issue));
  switch($column_name) {
    case 'date': 
      $value = $date->format('Y/m/d');
    break;
    default:
    break;
  }
  return $value;    
}
add_filter('manage_issue_custom_column', 'populate_date_column_for_issues', 10, 3);

ステップ3:新しい列をソート可能にする

function register_date_column_for_issues_sortable($columns) {
  $columns['date'] = 'issue_date';
  return $columns;
}
add_filter('manage_edit-issue_sortable_columns', 'register_date_column_for_issues_sortable');

ステップ4:カスタムソートを定義する(魔法が起こる場所)

function sort_issues_by_date($pieces, $taxonomies, $args) {
  global $pagenow;
  if(!is_admin()) {
    return $pieces;
  }

  if(is_admin() && $pagenow == 'edit-tags.php' && $taxonomies[0] == 'issue' && (!isset($_GET['orderby']) || $_GET['orderby'] == 'issue_date')) {
    $pieces['join']   .= " INNER JOIN wp_options AS opt ON opt.option_name = concat('issue_',t.term_id,'_issue_date')";
    $pieces['orderby'] = "ORDER BY opt.option_value";
    $pieces['order']   = isset($_GET['order']) ? $_GET['order'] : "DESC";
  }

  return $pieces;
}
add_filter('terms_clauses', 'sort_issues_by_date', 10, 3);

他のソート基準が設定されていない場合、ステップ4の私の条件付きステートメントもデフォルトのソートとしてissue_dateによる降順でソートします。

私はこれが他の誰かがより良い管理者経験をするために探しているのを助けるのを願っています!

2
cfx

この回答に感謝します。 WPがTerm Metaをサポートしたので、それを利用するためにステップ4を更新しました。この解決策は、この回答 https://wordpress.stackexchange.com/a/246206/85388 から借用して、meta_queryをオーダーバイに接続する方法を示します。

add_filter('pre_get_terms', 'uh_service_type_taxonomy__orderby');
function uh_service_type_taxonomy__orderby( $term_query ) {
  global $pagenow;
  if(!is_admin()) {
    return $term_query;
  }
  // WP_Term_Query does not define a get() or a set() method so the query_vars member must
  // be manipulated directly
  if(is_admin() && $pagenow == 'edit-tags.php' && $term_query->query_vars['taxonomy'][0] == 'uh_service_type_taxonomy' && (!isset($_GET['orderby']) || $_GET['orderby'] == 'term_order')) {
    // set orderby to the named clause in the meta_query
    $term_query->query_vars['orderby'] = 'order_clause';
    $term_query->query_vars['order'] = isset($_GET['order']) ? $_GET['order'] : "DESC";
    // the OR relation and the NOT EXISTS clause allow for terms without a meta_value at all
    $args = array('relation' => 'OR',
      'order_clause' => array(
        'key' => 'taxonomy_term_order',
        'type' => 'NUMERIC'
      ),
      array(
        'key' => 'taxonomy_term_order',
        'compare' => 'NOT EXISTS'
      )
    );
    $term_query->meta_query = new WP_Meta_Query( $args );
  }
  return $term_query;
}
1
Joel Stransky

カスタムフィールドは、ユーザーまたはテーマ/プラグインによって作成されたカスタム投稿メタデータです。この場合、カスタムフィールドの名前はyesnoです。

その列を投稿またはカスタム投稿タイプに追加するには(myposttype):

add_filter('manage_edit-myposttype_columns', 'my_custom_columns');
function my_custom_columns($columns) {
    $columns['yesno'] = 'Yes/No';
    return $columns;
}

これは、新しく追加された列をソート可能にする方法です。

add_filter('manage_edit-myposttype_sortable_columns', 'my_sortable_columns');
function my_sortable_columns($columns)
{
    $columns['yesno'] = 'yesno';
    return $columns;
}

そして、これはあなたがそれをどのように分類するかです

add_action('pre_get_posts', 'sort_my_posts');
function sort_my_posts($query)
{
    if (!is_admin())
        return;
    $orderby = $query->get('orderby');
    if ($orderby == 'yesno') {
        $query->set('meta_key', 'yesno');
        $query->set('orderby', 'yesno');
    }
}

そして、メタデータに保存されているYesまたはNoの値に対して、それらをascまたはdescにソートします。

これはあなたが探していたものですか?

0
aifrim

私のために、私はカスタム分類法を作りました、そしてそのカスタム分類法の中で私はカスタムメタを持っていました。私は管理バックエンドに列を入れたいと思い、それをソート可能にしました。カスタムメタのカスタム分類の分類可能な作業をするために私はこれをしました。

https://Pastebin.com/vr2sCKzX

public function pre_get_terms( $query ) {
    $meta_query_args = array(
        'relation' => 'AND', // Optional, defaults to "AND"
        array(
            'key'     => 'order_index',
            'value'   => 0,
            'compare' => '>='
        )
    );
    $meta_query = new WP_Meta_Query( $meta_query_args );
    $query->meta_query = $meta_query;
    $query->orderby = 'position_clause';
}

私はこのリンクで答えを見つけました https://core.trac.wordpress.org/ticket/34996

@ eherman24のコメントに記載されている回答を修正する必要がありました。

0
Lucas Gabriel