Setel Daftar Default "Lihat" di Admin

8

Saya mencari cara untuk mengatur opsi "Lihat" default di bawah jenis posting di area admin. Misalnya, secara default, Posting akan default ke tampilan "daftar" alih-alih "kutipan" - Saya ingin mengubah ini menjadi kutipan secara default - apa cara terbaik untuk mencapai ini? Saya sudah melakukan sedikit pencarian pada ini, tetapi saya terjebak di lumpur sejauh ini. Bantuan apa pun akan sangat dihargai. Terima kasih!

Zach
sumber

Jawaban:

9

Meskipun memiliki fitur pengaturan persisten di dalam inti itu bagus, mungkin butuh beberapa saat sebelum benar-benar diterima. WordPress 3.5 masih cukup jauh.

Jadi mari kita tambahkan $_REQUESTarray global saja.

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

Ini akan mengunci mode, memaksa excerptmode sepanjang waktu, jadi mari kita biarkan pengguna memutuskan tetapi tetap menggunakan metadata pengguna:

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

Anda dapat menginterpolasi lebih lanjut post_typeke semua dengan mempertimbangkan $_GET['post_type']variabel saat tersedia.

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

Biola! Mode daftar persisten per jenis posting per pengguna, tidak ada retasan.

soulseekah
sumber
1
Solusi yang bagus Punya yang jauh lebih mudah tak lama setelah saya memberi hadiah pada ini! Tapi, karena Anda memiliki solusinya, saya akan memberikan Anda hadiah, meskipun saya pikir saya akan memasukkan cara Anda sebagai gantinya yang sebenarnya persisten daripada seperti perilaku default kecuali dengan kutipan bukan daftar. Sunting, dapat menghadiahkannya dalam 17 jam jadi ikutilah saya!
Hosh Sadiq
Terima kasih, senang telah membantu. Pertanyaan yang sangat menarik.
soulseekah
Terima kasih atas @soulseekah ini, saya juga menggunakan ini dan berfungsi dengan baik. Seperti yang Anda sebutkan pada saat itu "WordPress 3.5 masih cukup jauh" - apakah kode ini masih bagus untuk digunakan dengan versi WordPress terbaru?
user3438958
5

Layar tampilan posting beralih dari tampilan daftar ke tampilan kutipan berdasarkan nilai parameter "mode" dalam string kueri. Jika parameter "mode" tidak disetel, maka WordPress default ke tampilan daftar.

Sayangnya, parameter ini tidak dapat difilter, jadi tidak ada cara mudah untuk mengontrolnya secara terprogram.

Jadi saya akan melakukan sesuatu yang tidak pernah saya lakukan ... Saya akan memberi tahu Anda cara meretas Core untuk membuat ini berfungsi ...

Menambahkan filter

Buka /wp-admin/includes/class-wp-posts-list-table.phpdan temukan prepare_items()metodenya (sekitar baris 81).

Pada baris 99, WordPress memeriksa untuk melihat apakah parameter "mode" disetel dalam permintaan dan menggunakannya untuk mengatur $modevariabel global :

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

Kami akan mengubah baris ini untuk memfilter pengaturan default. Ubah baris ini ke:

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

Sekarang, masuk ke functions.phpfile tema Anda dan tambahkan kode berikut:

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

Ini akan terhubung ke filter dan mengembalikan mode kutipan secara default.

Karena aturan pribadi saya tentang peretasan Core mengharuskan semua peretasan dikontribusikan kembali ke proyek (cara ini mereka dapat digulirkan ke dalam Core dan tidak lagi dihitung sebagai peretasan), saya telah membuka tiket Trac untuk peningkatan ini dan mengirimkan kode di atas sebagai tambalan. Silakan menimbang pada tiket sehingga bisa masuk ke inti untuk 3,5 (kita terlambat dalam siklus untuk 3,4, tetapi kita dapat mencoba untuk mendorong ini melalui untuk versi berikutnya).

EAMann
sumber
1
Sangat keren. Pasti berpikir "ini" adalah alasan untuk meretas inti - jadi di masa depan, Anda tidak perlu :)
Zach
1
Ada diskusi yang sedang berlangsung tentang tiket ini juga - ditambah tambalan lebih lanjut mengusulkan opsi pengguna, bukan hanya filter. Pantau terus percakapan itu jika Anda memutuskan untuk benar-benar meretas Core ... karena jika / ketika segalanya berubah di rilis mendatang, Anda juga perlu mengubah kode Anda.
EAMann
Mengapa tidak langsung meretas $_REQUESTglobal add_action( 'edit.php', ... )dan sejenisnya, sementara kami menunggu inti untuk mengadopsi tambalan / proposal?
soulseekah
@ Seoulseekah Alternatif yang bagus ... hanya bukan penggemar peretasan $_REQUESTobjek sendiri. Jangan ragu untuk mengirim jawaban lain yang menguraikan bagaimana hal itu bisa dilakukan.
EAMann
1
+1 untuk mendapatkannya di jalan menuju inti dengan beberapa tambalan hebat, mudah-mudahan kita akan segera melihat perubahannya.
soulseekah
2

Oke, tak lama setelah saya memberikan hadiah, saya datang dengan solusi berikut. Ini adalah perilaku default dalam segala hal, kecuali bahwa ia memilih tampilan kutipan untuk jenis posting apa pun yang Anda inginkan (bukan tampilan daftar default).

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

?>

CATATAN: Saya merekomendasikan pendekatan Soulseekah, jika Anda tidak ingin mengingat pilihan pengguna, Anda dapat sedikit menggabungkan kode saya dengan kodenya. CATATAN 2: Jika / ketika tambalan EAMann adalah bagian dari inti, jelas metodenya akan menjadi yang terbaik karena itu tidak mengharuskan Anda untuk terus maju. Saya hanya tidak suka saat ini karena Anda harus mengedit file inti.

Hosh Sadiq
sumber
1
Ini masuk akal. Namun, pagedtidak diperhitungkan (pagination) + menggunakan wp_redirectbukan header mentah mungkin akan sedikit "bersih", dan saya tidak yakin seberapa efisien pengalihan. Selain itu terlihat menarik. Selain itu, $_GET['post_type']mungkin tidak disetel, menghasilkan peringatan jika kesalahan diaktifkan. +1 untuk upaya dan kesabaran. Tidak menyadari pertanyaan itu sudah sangat tua.
soulseekah
2
Masalah saya dengan pendekatan ini adalah bahwa itu melibatkan pengalihan. Jadi Anda memuat WP tidak hanya sekali, tetapi dua kali hanya untuk sampai ke halaman daftar posting.
EAMann
@Soulseekah, Anda benar, tidak berpikir bahwa sampai selesai, saya telah memperbarui kode untuk memperhitungkan semua $_GETvariabel. Adapun $_GET['post_type'], jujur, saya tidak terlalu peduli dengan itu karena saya hanya memerlukannya untuk jenis posting kustom, yang akan selalu ada. Jelas ini bisa dihilangkan. @ EAMann, Anda benar, namun, ini adalah solusi terbaik yang bisa saya dapatkan. Saya mencoba mengatur $_GETparameter secara manual , berharap itu akan diset SEBELUM itu dibaca, tapi sepertinya tidak demikian.
Hosh Sadiq