管理者にデフォルトのリスト「ビュー」を設定する


8

管理領域の投稿タイプの下でデフォルトの「表示」オプションを設定する方法を探しています。たとえば、デフォルトでは、投稿は「抜粋」ではなく「リスト」ビューになります-これをデフォルトで抜粋に変更したいのですが、これを実現する最良の方法は何ですか?私はこれについて少し調べてみましたが、今のところ泥で立ち往生しています。どんな助けでも大歓迎です。ありがとう!

回答:


9

コアに永続的な設定の機能があることは良いことですが、実際に受け入れられるまでにはかなり時間がかかる場合があります。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']変数を考慮に入れることで、さらにすべてを補間できます。

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

ビオラ!ユーザーごとの投稿タイプごとの永続的なリストモード、ハッキングなし。


1
良い解決策。私はこれに賞金をかけた直後にはるかに簡単なものを手に入れました!しかし、あなたには解決策があるので、私はあなたに賞金を差し上げますが、リストの代わりに抜粋を除いて、デフォルトの動作とは異なり、実際には永続的であるため、代わりにあなたの方法を組み込みます。編集、17時間で授与できるので、我慢してください!
Hosh Sadiq

お役に立ててうれしいです。非常に興味深い質問です。
soulseekah

この@soulseekahに感謝します。私もこれを使用しました。当時、「WordPress 3.5はまだかなり遠い」とおっしゃっていましたが、このコードは最新のWordPressバージョンで使用するのに適していますか?
user3438958 2015

5

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

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

だから私は絶対にしないことをするつもりです...私はこれを動作させるためにコアをハックする方法をあなたに教えるつもりです...

フィルターを追加する

メソッドを開い/wp-admin/includes/class-wp-posts-list-table.phpて見つけますprepare_items()(81行目あたり)。

99行目で、WordPressはリクエストに「モード」パラメーターが設定されているかどうかを確認し、これを使用してグローバル$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チケット開き、上記のコードを送信しましたパッチとして。3.5のコアに入ることができるようにチケットを量ってください(3.4のサイクルには遅すぎますが、次のバージョンに向けてこれをプッシュすることができます)。


1
とてもかっこいい。「これ」がコアをハックする理由であると明確に考えてください-将来的には、あなたがする必要はありません:)
Zach

1
このチケットについても継続的な議論が行われています。さらに、フィルターではなくユーザーオプションを提案するパッチが追加されています。実際にCoreをハックすることに決めた場合は、その会話を追跡してください...将来のリリースで状況が変わる場合は、コードも変更する必要があるためです。
EAMann 2012年

コアがパッチ/プロポーザルを採用するのを待つ間、なぜ$_REQUESTグローバルをハックするだけではないのadd_action( 'edit.php', ... )ですか?
soulseekah

@Soulseekah良い代替案... $_REQUESTオブジェクトを自分でハッキングするファンではありません。それがどのように実行できるかを概説する別の回答を自由に投稿してください。
EAMann 2012年

1
いくつかの優れたパッチでコアへの道を進むための+1、うまくいけば、チェンジセットがまもなく表示されるでしょう。
soulseekah

2

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

<?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のパッチがコアの一部である場合は、長い道のりを回る必要がないため、明らかに彼の方法が最良の方法です。あなたはコアファイルを編集しなければならないので、私は現時点ではそれが好きではありません。


1
意味あり。ただし、paged考慮されていません(改ページ)+ wp_redirect生のヘッダーの代わりに使用することは少し "きれい"になる可能性があり、リダイレクトの効率がどれほどかはわかりません。それ以外は面白いですね。また、$_GET['post_type']設定されていない可能性があり、エラーがオンになっている場合は警告が表示されます。努力と忍耐のための+1。質問がとても古いことに気づかなかった。
soulseekah

2
このアプローチの私の問題は、リダイレクトが含まれることです。したがって、WPを1回ではなく2回ロードして、投稿リストページにアクセスします。
EAMann 2012年

@Soulseekah、あなたが正しい、それを考えていなかったので、すべての$_GET変数を考慮するようにコードを更新しました。については$_GET['post_type']、正直に言って、いつもそこにあるカスタムの投稿タイプである必要があるだけなので、それほど気になりませんでした。明らかにこれは省略できます。@EAMann、あなたは正しいです、しかし、これは私が思いつくことができる最高の解決策でした。$_GET読み込まれる前に設定されることを期待して、手動でパラメーターを設定してみましたが、そうではなかったようです。
Hosh Sadiq
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.