回答:
コアに永続的な設定の機能があることは良いことですが、実際に受け入れられるまでにはかなり時間がかかる場合があります。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;
}
ビオラ!ユーザーごとの投稿タイプごとの永続的なリストモード、ハッキングなし。
ポストビュー画面は、クエリ文字列の「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のサイクルには遅すぎますが、次のバージョンに向けてこれをプッシュすることができます)。
$_REQUEST
グローバルをハックするだけではないのadd_action( 'edit.php', ... )
ですか?
$_REQUEST
オブジェクトを自分でハッキングするファンではありません。それがどのように実行できるかを概説する別の回答を自由に投稿してください。
さて、私が賞金を上げた直後に、私は次の解決策を思いつきました。これは、デフォルトのリストビューではなく、必要な投稿タイプの抜粋ビューを選択することを除いて、あらゆる点でデフォルトの動作です。
<?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のパッチがコアの一部である場合は、長い道のりを回る必要がないため、明らかに彼の方法が最良の方法です。あなたはコアファイルを編集しなければならないので、私は現時点ではそれが好きではありません。
paged
考慮されていません(改ページ)+ wp_redirect
生のヘッダーの代わりに使用することは少し "きれい"になる可能性があり、リダイレクトの効率がどれほどかはわかりません。それ以外は面白いですね。また、$_GET['post_type']
設定されていない可能性があり、エラーがオンになっている場合は警告が表示されます。努力と忍耐のための+1。質問がとても古いことに気づかなかった。
$_GET
変数を考慮するようにコードを更新しました。については$_GET['post_type']
、正直に言って、いつもそこにあるカスタムの投稿タイプである必要があるだけなので、それほど気になりませんでした。明らかにこれは省略できます。@EAMann、あなたは正しいです、しかし、これは私が思いつくことができる最高の解決策でした。$_GET
読み込まれる前に設定されることを期待して、手動でパラメーターを設定してみましたが、そうではなかったようです。