Đặt danh sách mặc định Xem trực tuyến trong quản trị viên


8

Tôi đang tìm cách để đặt các tùy chọn "Xem" mặc định trong các loại bài đăng trong khu vực quản trị. Ví dụ: theo mặc định, Bài viết sẽ mặc định ở chế độ xem "danh sách" thay vì "trích đoạn" - Tôi muốn thay đổi điều này thành đoạn trích theo mặc định - cách tốt nhất để đạt được điều này là gì? Tôi đã thực hiện một chút tìm kiếm về điều này, nhưng cho đến nay vẫn bị mắc kẹt trong bùn. Mọi sự trợ giúp sẽ rất được trân trọng. Cảm ơn!

Câu trả lời:


9

Mặc dù có tính năng cài đặt liên tục trong lõi là tốt, nhưng có thể mất khá nhiều thời gian trước khi nó thực sự được chấp nhận. WordPress 3.5 vẫn còn khá xa.

Vì vậy, hãy tăng cường $_REQUESTmảng toàn cầu thay thế.

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

Điều này sẽ khóa các chế độ, buộc excerptchế độ mọi lúc, vì vậy, hãy để người dùng quyết định nhưng hãy kiên trì sử dụng siêu dữ liệu của người dùng:

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

Bạn có thể nội suy thêm post_typevào tất cả bằng cách tính đến $_GET['post_type']biến khi có sẵn.

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

Viola! Chế độ danh sách liên tục cho mỗi loại bài đăng trên mỗi người dùng, không có hack.


1
Giải pháp tốt. Có một dễ dàng hơn nhiều ngay sau khi tôi đặt tiền thưởng vào việc này! Nhưng, vì bạn có giải pháp, tôi sẽ đưa tiền thưởng cho bạn, mặc dù tôi nghĩ rằng tôi sẽ kết hợp theo cách của bạn thay vì đó thực sự là dai dẳng thay vì thích hành vi mặc định trừ đoạn trích thay vì danh sách. Chỉnh sửa, có thể thưởng nó trong 17 giờ vì vậy hãy chịu đựng với tôi!
Hosh Sadiq

Cảm ơn bạn, vui mừng vì đã được giúp đỡ. Một câu hỏi rất thú vị.
soulseekah

Cảm ơn vì điều này @soulseekah, tôi cũng đã sử dụng nó và làm việc rất tốt. Như bạn đã đề cập tại thời điểm "WordPress 3.5 vẫn còn khá xa" - mã này có còn tốt để sử dụng với phiên bản WordPress mới nhất không?
dùng3438958

5

Màn hình chế độ xem bài đăng chuyển từ chế độ xem danh sách sang chế độ xem trích dẫn dựa trên giá trị của tham số "chế độ" trong chuỗi truy vấn. Nếu tham số "chế độ" không được đặt, thì WordPress mặc định thành chế độ xem danh sách.

Thật không may, tham số này không thể lọc được, vì vậy không có cách nào dễ dàng để kiểm soát nó theo chương trình.

Vì vậy, tôi sẽ làm điều mà tôi không bao giờ làm ... Tôi sẽ cho bạn biết cách hack Core để làm cho công việc này ...

Thêm bộ lọc

Mở /wp-admin/includes/class-wp-posts-list-table.phpvà tìm prepare_items()phương thức (khoảng dòng 81).

Trên dòng 99, WordPress kiểm tra xem liệu tham số "chế độ" có được đặt trong yêu cầu hay không và sử dụng thông số này để đặt $modebiến toàn cục:

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

Chúng tôi sẽ thay đổi dòng này để lọc cài đặt mặc định. Thay đổi dòng này thành:

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

Bây giờ, đi vào functions.phptệp của chủ đề của bạn và thêm mã sau đây:

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

Điều này sẽ nối vào bộ lọc và trả về chế độ trích dẫn theo mặc định.

Vì quy tắc cá nhân của tôi về việc hack Core yêu cầu tất cả các vụ hack được đóng góp lại cho dự án (theo cách này chúng có thể được đưa vào Core và không còn được tính là hack), tôi đã mở một vé Trac cho cải tiến này và gửi mã ở trên như một bản vá. Vui lòng cân nhắc về vé để có thể vào được lõi cho 3,5 (chúng tôi đã quá trễ trong chu kỳ cho 3,4, nhưng chúng tôi có thể cố gắng đẩy mạnh điều này cho phiên bản tiếp theo).


1
Rất tuyệt. Chắc chắn nghĩ rằng "cái này" là một lý do để hack lõi - vì vậy trong tương lai, bạn không cần phải :)
Zach

1
Cũng có cuộc thảo luận về vé này - cộng với một bản vá tiếp theo đề xuất tùy chọn người dùng thay vì chỉ một bộ lọc. Vui lòng theo dõi cuộc trò chuyện đó nếu bạn quyết định thực sự hack Core ... bởi vì nếu / khi mọi thứ thay đổi trong phiên bản tương lai, bạn cũng sẽ cần thay đổi mã của mình.
EAMann

Tại sao không hack $_REQUESTtoàn cầu add_action( 'edit.php', ... )và những thứ tương tự, trong khi chúng ta chờ đợi cốt lõi chấp nhận bản vá / đề xuất?
soulseekah

@Soulseekah Thay thế tốt ... chỉ không phải là một fan hâm mộ của việc hack $_REQUESTđối tượng bản thân mình. Vui lòng gửi câu trả lời khác phác thảo làm thế nào nó có thể được thực hiện.
EAMann

1
+1 để đưa nó vào con đường cốt lõi với một số bản vá tuyệt vời, hy vọng chúng ta sẽ sớm thấy các thay đổi.
soulseekah

2

Được rồi, vì vậy ngay sau khi tôi đưa tiền thưởng lên, tôi đã đưa ra giải pháp sau đây. Đây là hành vi mặc định theo mọi cách, ngoại trừ việc nó chọn chế độ xem trích dẫn cho bất kỳ loại bài đăng nào bạn muốn (thay vì chế độ xem danh sách mặc định).

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

?>

LƯU Ý: Tôi khuyên bạn nên sử dụng phương pháp của Soulseekah, nếu bạn không muốn nó nhớ lựa chọn của người dùng, bạn có thể kết hợp mã của tôi với mã của anh ấy một chút. CHÚ THÍCH 2: Nếu / khi bản vá của EAMann là một phần của lõi, rõ ràng phương pháp của anh ta sẽ là phương pháp tốt nhất vì nó sẽ không yêu cầu bạn phải đi một chặng đường dài. Tôi chỉ không thích nó vào lúc này vì bạn phải chỉnh sửa các tập tin cốt lõi.


1
Điều này thật ý nghĩa. Tuy nhiên, pagedkhông được tính đến (phân trang) + sử dụng wp_redirectthay vì tiêu đề thô có thể sẽ "sạch" hơn một chút và tôi không chắc chắn cách chuyển hướng hiệu quả. Khác hơn là có vẻ thú vị. Ngoài ra, $_GET['post_type']có thể không được đặt, dẫn đến cảnh báo nếu lỗi được bật. +1 cho nỗ lực và sự kiên nhẫn. Không nhận ra câu hỏi đã quá cũ.
soulseekah

2
Vấn đề của tôi với phương pháp này là nó liên quan đến một chuyển hướng. Vì vậy, bạn đang tải WP không chỉ một lần, mà hai lần chỉ để vào trang danh sách bài đăng.
EAMann

@Soulseekah, bạn nói đúng, không nghĩ rằng thông qua, tôi đã cập nhật mã để tính đến tất cả các $_GETbiến. Đối với $_GET['post_type'], thành thật mà nói, tôi đã không quá bận tâm với điều đó vì tôi chỉ yêu cầu nó phải dành cho một loại bài đăng tùy chỉnh, sẽ luôn ở đó. Rõ ràng điều này có thể được bỏ qua. @EAMann, Bạn nói đúng, tuy nhiên, đây là giải pháp tốt nhất tôi có thể nghĩ ra. Tôi đã thử cài đặt thủ công $_GETcác tham số, hy vọng rằng nó sẽ được đặt TRƯỚC KHI nó đã được đọc, nhưng điều này dường như không phải là trường hợp.
Hosh Sadiq
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.