web-dev-qa-db-ja.com

カスタム投稿タイプの管理者用一覧のカスタムフィールドで絞り込む

私は私が単純な選択ボックスを使用して選択している "issue"投稿タイプのID番号であるカスタムフィールド "issue"を持つカスタム投稿タイプ "Article"を持っています。

ここにある記事のリストを絞り込むために問題のドロップダウンを追加したいです。

edit.php?post_type=article

これは可能ですか?このようなことはどこかに文書化されていますか?ドキュメントや例が見つかりませんでした。

リストをフィルタし、フィルタコントロールに選択を追加するにはどのようなフックがありますか?

3
Will

私はフィルタが機能するように最大の答えを修正しなければなりませんでした。 selectの名前をissue_restrict_articlesに変更すると、フィルタ処理が誤って停止され、画面上のフィルタコントロールが保持されていました。 posts_whereフィルタと実際にフィルタ処理するSQLクエリ。

function restrict_articles_by_issue() {
    global $wpdb;
    $issues = $wpdb->get_col("
        SELECT DISTINCT meta_value
        FROM ". $wpdb->postmeta ."
        WHERE meta_key = 'issue'
        ORDER BY meta_value
    ");
    ?>
    <label for="issue">Issues:</label>
    <select name="issue_restrict_articles" id="issue">
        <option value="">Show all</option>
        <?php foreach ($issues as $issue) { ?>
        <option value="<?php echo esc_attr( $issue ); ?>" <?php if(isset($_GET['issue_restrict_articles']) && !empty($_GET['issue_restrict_articles']) ) selected($_GET['issue_restrict_articles'], $issue); ?>>
        <?php
          $issue   = get_post($issue);
          echo $issue->post_title;
        ?>
        </option>
        <?php } ?>
    </select>
    <?php
}
add_action('restrict_manage_posts','restrict_articles_by_issue');



function posts_where( $where ) {
    if( is_admin() ) {
        global $wpdb;       
        if ( isset( $_GET['issue_restrict_articles'] ) && !empty( $_GET['issue_restrict_articles'] ) && intval( $_GET['issue_restrict_articles'] ) != 0 ) {
            $issue_number = intval( $_GET['issue_restrict_articles'] );

            $where .= " AND ID IN (SELECT post_id FROM " . $wpdb->postmeta ." 
WHERE meta_key='issue' AND meta_value=$issue_number )";
        }
    }   
    return $where;
}
add_filter( 'posts_where' , 'posts_where' );
8
Will

テーマfunctions.phpに以下のコードを配置してください。

function articlesIssuesRequestAdmin($request) {
    if( isset($_GET['issue']) && !empty($_GET['issue']) ) {
        $request['meta_key'] = 'issue';
        $request['meta_value'] = $_GET['issue'];
    }
    return $request;
}

function articlesIssuesRestrictManagePosts() {
    global $wpdb;
    $issues = $wpdb->get_col("
        SELECT DISTINCT meta_value
        FROM ". $wpdb->postmeta ."
        WHERE meta_key = 'issue'
        ORDER BY meta_value
    ");
    ?>
    <label for="issue">Issues:</label>
    <select name="issue" id="issue">
        <option value="">Show all</option>
        <?php foreach ($issues as $issue) { ?>
        <option value="<?php echo esc_attr( $issue ); ?>" <?php if(isset($_GET['issue']) && !empty($_GET['issue']) ) selected($_GET['issue'], $issue); ?>><?php echo esc_attr($issue); ?></option>
        <?php } ?>
    </select>
    <?php
}

if( is_admin() && isset($_GET['post_type']) && $_GET['post_type'] == 'articles' ) {
    add_filter('request', 'articlesIssuesRequestAdmin');
    add_filter('restrict_manage_posts', 'articlesIssuesRestrictManagePosts');
}
3
Max Yudin