問題描述

我正在尋找一種方法來在管理區域中的 post 型別下設定預設的”View” 選項。例如,預設情況下,帖子將預設為”list” 檢視而不是”excerpt” – 我想將其更改為摘錄,預設情況下 – 實現此目的的最佳方法是什麼?我已經做了一些這樣的搜尋,但是我陷入泥巴 thus-far 。任何幫助將不勝感激。謝謝!

最佳解決方案

雖然在核心中具有永久性設定的功能很好,但在實際被接受之前可能需要相當長的時間。 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;
}

您可以透過考慮 $_GET['post_type']變數 (如果可用) 來進一步插入 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 變數:

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

這將掛接到過濾器並預設返回摘錄模式。

由於我關於駭客核心的個人規則要求所有的駭客都可以歸還給專案 (這樣他們可以被轉化為核心,不再被視為一個駭客),我有 opened a Trac ticket 這個增強功能,並提交了上面的程式碼作為補丁。請在票上加註,以便它可以進入 3.5 的核心 (我們在 3.4 的週期中太晚了,但是我們可以嘗試推送下一個版本) 。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。