web-dev-qa-db-ja.com

管理者でデフォルトのリストを「表示」に設定する

管理領域の投稿タイプでデフォルトの[表示]オプションを設定する方法を探しています。たとえば、デフォルトではPostsはデフォルトで "excerpt"ではなく "list"ビューになります - これをデフォルトで抜粋に変更したいのですが - これを達成するための最良の方法は何でしょうか。私はこれを少し調べましたが、これまでのところ泥にはまっています。任意の助けは大歓迎です。ありがとうございます。

7
Zach

コアに永続的設定の機能があるのはいいことですが、実際に受け入れられるまでにはしばらく時間がかかるかもしれません。 WordPress 3.5はまだかなり遠いです。

それでは代わりにグローバル$_REQUEST配列を増やしましょう。

add_action( 'load-edit.php', 'wpse34956_force_excerpt' );
function wpse34956_force_excerpt() {
    $_REQUEST['mode'] = 'excerpt';
}

これはモードをロックし、常にexcerptモードを強制します、それではユーザのメタデータを使用してそれを永続化しながらユーザに決定させましょう:

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {
    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode', $_REQUEST['mode'] );
        return;
    }
    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode', true ) )
        $_REQUEST['mode'] = $mode;
}

可能であればpost_type変数を考慮に入れることで、さらに$_GET['post_type']をallに補間できます。

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {

    // take into account post types that support excerpts
    $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
    if ( $post_type && !post_type_supports( $post_type, 'excerpt' ) )
        return; // don't care

    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, $_REQUEST['mode'] );
        return;
    }

    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, true ) )
        $_REQUEST['mode'] = $mode;
}

ビオラ!ユーザーごとの投稿タイプごとの固定リストモード、ハッキングはありません。

9
soulseekah

ポストビュー画面は、クエリ文字列の「モード」パラメータの値に基づいてリストビューから抜粋ビューに切り替わります。 「mode」パラメーターが設定されていない場合、WordPressはデフォルトでリストビューになります。

残念ながら、このパラメーターはnotフィルター可能であるため、プログラムで制御する簡単な方法はありません。

だから私は決してやらないことをするつもりです...私はこの仕事をするためにCoreをハックする方法を教えます...

フィルターを追加する

/wp-admin/includes/class-wp-posts-list-table.phpを開き、prepare_items()メソッドを見つけます(81行目付近)。

99行目で、WordPressはリクエストで「mode」パラメーターが設定されているかどうかを確認し、これを使用してグローバル$mode変数を設定します。

$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];

この行を変更して、デフォルト設定をフィルタリングします。この行を次のように変更します。

$mode = empty( $_REQUEST['mode'] ) ? apply_filters( 'default-posts-list-mode', 'list' ) : $_REQUEST['mode'];

次に、テーマのfunctions.phpファイルに移動して、次のコードを追加します。

add_filter( 'default-posts-list-mode', 'my_default_posts_list_mode' );
function my_default_posts_list_mode( $default ) {
    return 'excerpt';
}

これはフィルターにフックし、デフォルトで抜粋モードを返します。

Coreのハッキングに関する私の個人的なルールでは、すべてのハックがプロジェクトに貢献する必要があるため(この方法でCoreにロールバックでき、ハックとしてカウントされなくなります)、 Tracチケットを開いた forこの機能拡張と上記のコードをパッチとして提出しました。 3.5のコアに入ることができるようにチケットを量ってください(3.4のサイクルでは遅すぎますが、次のバージョンでこれをプッシュすることができます)。

5
EAMann

さて、私が賞金を上げた直後に、私は以下の解決策を思い付きました。どのような投稿タイプでも(デフォルトのリストビューではなく)抜粋ビューを選択する点を除いて、これはあらゆる点でデフォルトの動作です。

<?php

add_action( 'admin_init', 'my_admin_init' ); // initiate admin hook

function my_admin_init() {
    // if mode is not set redirect to a default mode.
    if(!isset($_GET['mode'])) {
        if('forms' == $_GET['post_type'] || 'client-quotes' == $_GET['post_type'] ) {
            wp_redirect( admin_url( 'edit.php?mode=excerpt&' . http_build_query( $_GET ) ) );
            exit;
        }
    }
}

?>

注:Soulseekahのアプローチをお勧めします。ユーザーの選択を記憶させたくない場合は、私のコードを彼のコードに少し組み込むことができます。注2:EAMannのパッチがコアの一部である場合は、明らかに彼の方法が最善の方法です。コアファイルを編集する必要があるので、現時点では好きではありません。

2
Hosh Sadiq