Tambahkan opsi layar ke halaman admin khusus

13

Saya ingin menambahkan opsi layar ke halaman pengaturan plugin saya, seperti yang tersedia di Dashboard.

masukkan deskripsi gambar di sini

Saya mencoba menggunakan add_optionmetode WP_Screenobjek dan ternyata hanya mendukung dua opsi. per_pagedan layout_columns.

Adakah yang tahu opsi layar apa yang digunakan untuk mendapatkan opsi seperti yang ada di halaman Dashboard?

Edit :

Biarkan saya jelaskan apa yang saya coba sedikit.

Saya memiliki bagian yang berbeda di Plugin Penghapusan Massal saya dan setiap bagian membiarkan orang menghapus posting berdasarkan beberapa kriteria (seperti kategori, tag, taksonomi khusus, dll.). Saya ingin membiarkan pengguna memilih bagian mana yang ingin mereka gunakan dan bagian mana yang ingin mereka sembunyikan, mirip dengan halaman Dashboard, di mana pengguna dapat memilih widget dashboard mana yang ingin mereka lihat dan yang harus disembunyikan.

Sekarang, untuk mengimplementasikan ini, saya ingin menampilkan daftar kotak centang (satu untuk setiap bagian) dan biarkan pengguna memilih yang mana untuk ditampilkan.

Untuk memperlihatkan daftar kotak centang, saya harus memanggil add_optionmetode WP_Screenobjek. Ketika saya melakukan itu, saya menemukan bahwa add_optionfungsi saat ini hanya mendukung kedua jenis ini dan yang lainnya diabaikan.

  • per halaman
  • layout_columns

Tapi, hanya di halaman dasbor kotak centang ditampilkan. Saya ingin tahu cara meniru hal serupa di bagian opsi layar pada halaman admin kustom saya juga.

Sudar
sumber
Ya, tab Screen Options sepertinya tidak bisa ditembus ... Bagaimana dengan membajak tab Help untuk melakukan itu?
brasofilo

Jawaban:

6

Anda tidak perlu membuat baris opsi layar baru. Cukup gunakan metabox yang tepat.

Saat ini, Anda menggambar pseudo-metabox:

<!-- Post status start-->
        <div class = "postbox">
            <div class = "handlediv"> <br> </div>
            <h3 class = "hndle"><span><?php _e("By Post Status", 'bulk-delete'); ?></span></h3>
        <div class = "inside">
        <h4><?php _e("Select the posts which you want to delete", 'bulk-delete'); ?></h4>

Anda harus melakukan ini:

<div id="post-body-content">
    <!-- #post-body-content -->
</div>

<div id="postbox-container-1" class="postbox-container">
    <?php do_meta_boxes('','side',$object); ?>
</div>

<div id="postbox-container-2" class="postbox-container">
    <?php do_meta_boxes('','normal',$object); ?>
    <?php do_meta_boxes('','advanced',$object); ?>
</div>

Kemudian daftarkan metabox Anda sendiri dengan add_meta_box().

Baca Kotak Meta di Halaman Kustom dari Stephen Harris untuk semua detailnya ( demo di GitHub ).
Poin utamanya adalah: Anda akan mendapatkan opsi layar untuk kotak-kotak ini secara gratis.

Dan ketika WordPress mengubah markup batin untuk metabox suatu hari, kode Anda mungkin akan tetap berfungsi, karena Anda telah menggunakan API.

fuxia
sumber
Terima kasih untuk kodenya dan tautannya. Memodifikasi Plugin saya untuk memasukkan ini sekarang.
Sudar
4

Anda dapat melakukannya, dengan menggunakan filter yang tepat di dalam \WP_Screenkelas. Pastikan bahwa Anda tidak beralih pada per default:

Cara menampilkan atau menyembunyikan tab

Filter berikut menunjukkan cara menampilkan atau menyembunyikan tab. Sebenarnya, karena ada filter yang lebih baik, cara berikut lebih bermanfaat jika Anda perlu menyembunyikan tab secara paksa ketika sudah ada:

add_filter( 'screen_options_show_screen', function( $show, \WP_Screen $screen )
{
    // Navigate to the screen of choice and uncomment the following line to find out the 'base' val
    // var_dump( $screen );
    return 'your_screen_id' !== $screen->base
        ? $show
        : true;
}, 10, 2 );

Cara menampilkan tab dan menambahkan konten khusus

Berikut ini memperlihatkan tab pengaturan yang berisi bidang input yang menyimpan nilai amountyang dapat Anda gunakan dengan cara apa pun pada halaman Anda (misalnya membatasi hasil $wpdbkueri).

/**
 * @param string     $settings
 * @param \WP_Screen $screen
 */
add_filter( 'screen_settings', function( $settings, \WP_Screen $screen )
{
    if ( 'your_screen_id' !== $screen->base )
        return $settings;

    $amount = isset( $_GET['paged'] ) 
        ? filter_var(
            absint( $_GET['paged'] ),
            FILTER_SANITIZE_NUMBER_INT,
            FILTER_NULL_ON_FAILURE
        ) 
        : 1;

    return sprintf(
        '<label for="amount">Amount:</label> '
        .'<input step="1" min="1" max="999" class="screen-per-page" name="amount" val="%d">',
        .get_submit_button( 'Set', 'secondary', 'submit-amount', false ),
        $amount
    );
}, 10, 2 );
kaisar
sumber
1

Berikut adalah contoh lengkap dan ringkas berdasarkan Meta Boxes on Custom Pages oleh Stephen Harris :

Kode yang sama dengan intisari

<?php

/**
 * Plugin Name:     LHF Volunteer Form
 * Description:     Manages a google-sheet full of names and emails
 * Plugin URI:      http://ladehammerfestivalen.no/volunteer
 * Author URI:      http://genja.org
 * Author:          [email protected]
 * Text Domain:     lhf-volunteer-form
 * Domain Path:     /languages
 * Version:         0.2.0
 * @package         Lhf_Volunteer_Form
 */

require_once  __DIR__ . '/vendor/autoload.php';

use Lhf\Sheet\RegistrationsSheet;

frivilligSystemMain();

function frivilligSystemMain() {
    try {
        $regSheet = \Lhf\Sheet\RegistrationsSheet::createInWordPress();
    } catch (\Exception $ex) {
        error_log(sprintf('%s:%d %s', __FILE__, __LINE__, $ex->getMessage()));
    }
    add_action('init', function() use ($regSheet) {
        if (is_admin()) {
            add_action( 'admin_menu', function() use ($regSheet) {
                $screenId = DashboardView::screen_id;
                $pageId = add_dashboard_page( 'hammerater', 'Hammerater', 'endre_frivillig_skjema', $screenId,
                    function () use ($regSheet) { DashboardView::renderVolunteerDashboard($regSheet); } );
                add_action("load-$pageId", function() use ($regSheet, $pageId, $screenId) {
                    wp_enqueue_script('postbox');
                    add_screen_option('layout_columns', array('max' => 2, 'default' => 2) );
                    do_action("add_meta_boxes_$screenId", null); // allow third parties to hook into this.
                    do_action('add_meta_boxes', $screenId, null); // allow third parties to hook into this.
                });
                add_action("add_meta_boxes_$screenId", function () use ($regSheet) { DashboardView::registerMetaboxes($regSheet); });
            });
        }
    });
}

class DashboardView
{
    const screen_id = 'frivillig-liste';

    private static function includeAdminHeader()
    {
        require_once( ABSPATH . 'wp-admin/admin.php');
        require_once( ABSPATH . 'wp-admin/includes/dashboard.php');
        require_once( ABSPATH . 'wp-admin/admin-header.php');
        wp_dashboard_setup();
        wp_enqueue_script( 'dashboard' );
        add_thickbox();
        do_action( 'add_meta_boxes' );
        if ( wp_is_mobile() ) {
            wp_enqueue_script( 'jquery-touch-punch' );
            //wp_dequeue_script('jquery-migrate');
        }

        wp_enqueue_script( 'datatables', '//cdn.datatables.net/1.10.16/js/jquery.dataTables.js');
        wp_enqueue_style( 'datatables', '//cdn.datatables.net/1.10.16/css/jquery.dataTables.css');

        wp_enqueue_script( 'datatables-responsive', '//cdn.datatables.net/responsive/2.2.1/js/dataTables.responsive.min.js');
        wp_enqueue_style(  'datatables-responsive', '//cdn.datatables.net/responsive/2.2.1/css/responsive.dataTables.min.css');

        wp_enqueue_script( 'datatables-row-group', '//cdn.datatables.net/rowgroup/1.0.2/js/dataTables.rowGroup.min.js');
        wp_enqueue_style(  'datatables-row-group', '//cdn.datatables.net/rowgroup/1.0.2/css/rowGroup.dataTables.min.css');
    }

    static function renderVolunteerDashboard(RegistrationsSheet $regSheet) {
        static::includeAdminHeader();
        wp_enqueue_script('lhf-sheets');
        $workTypes = get_option( 'lhfsheets_form_work_types' );
        ?>
        <div class="wrap">
            <form>
<?php
        wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
        wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
?>
            <h1>Frivillige Hammerater</h1>
            <h2 class="nav-tab-wrapper">
                <a href="<?= admin_url( 'index.php?page=frivillig-liste&tab=liste' ) ?>" >Liste</a>
                <a href="<?= admin_url( 'index.php?page=frivillig-liste&tab=preferanser' ) ?>">Arbeidsposter</a>
                <a href="<?= admin_url( 'index.php?page=frivillig-liste&tab=info' ) ?>">Frivilliginfo</a>
            </h2>
            <?php
            $screen      = get_current_screen();
            $columns     = absint( $screen->get_columns() );
            $columns_css = '';
            if ( $columns ) {
                $columns_css = " columns-$columns";
            }
            ?>

            <?php if ( $_GET['tab'] == 'liste' || ! $_GET['tab'] ) { ?>
                <div id="dashboard-widgets" class="metabox-holder<?php echo $columns_css; ?>">
                    <div id="postbox-container-1" class="postbox-container">
                        <?php do_meta_boxes( $screen->id, 'main_list', '' ); ?>
                    </div>
                </div>
            <?php } ?>

            <?php if ( $_GET['tab'] == 'preferanser' || ! $_GET['tab'] ) { ?>
                <div id="dashboard-widgets" class="metabox-holder<?php echo $columns_css; ?>">
                    <div id="preferences-sortables" class="postbox-container">
                        <?php do_meta_boxes( $screen->id, 'preferences', ''); ?>
                    </div>
                    <div id="preferences_left-sortables" class="postbox-container">
                        <?php do_meta_boxes( $screen->id, 'preferences_right', ''); ?>
                    </div>
                </div>
            <?php } ?>
            <?php if ( $_GET['tab'] == 'info' ) { ?>
                        <h3>Annen info</h3>
            <?php } ?>
            </form>
        </div>
        <?php
    }

    static function renderMainList($records, $status = 'registered/served/contacted') {
        /** @var Frivillig $e */
        ?>
        <div class="main">
          <table id="frivillige-hammerater-<?= $status ?>" style="display:none" data-status="<?= $status ?>">
            <?php foreach ($records as $e) { ?>
              <tr> ...  </tr>
            <?php } ?>
            </tbody>
          </table>
        </div>
        <?php
    }

    public static function registerMetaboxes( RegistrationsSheet $regSheet ) {
        if ($_GET['tab'] == 'info') { return; }
        $all = $regSheet->getVolunteerRecords();
        if ($_GET['tab'] == 'liste' || $_GET['tab'] === null) {
            foreach (Frivillig::states() as $state) {
                add_meta_box(
                    "volunteers-search-all",
                    __('Verktøy') ,
                    function () use ($state) { DashboardView::renderGlobalSearchMetaBox(); },
                    'dashboard_page_frivillig-liste',
                    'main_list'
                );

                $peopleWithState = [];
                foreach ($all as $f) { if ($f->status === $state) { $peopleWithState[] = $f; } }

                add_meta_box(
                    "volunteers-$state",
                    DashboardView::$stateName[$state],
                    function () use ($peopleWithState, $state) { DashboardView::renderMainList($peopleWithState, $state); },
                    'dashboard_page_frivillig-liste',
                    'main_list'
                );
            }
        }

        if ($_GET['tab'] == 'preferanser') {
            $workTypes = get_option('lhfsheets_form_work_types');
            foreach ($workTypes as $workType) {
                $workers = [];
                foreach ($all as $frivillig) {
                    $interests = preg_split('/,\s+/', $frivillig->interests);
                    if (in_array($workType['slug'], $interests)) {
                        $workers[] = $frivillig;
                    }
                }
                add_meta_box(
                    "volunteer-prefers-{$workType['slug']}",
                    $workType['description'],
                    function () use ($workers, $workType) { DashboardView::renderPreferences($workers, $workType); },
                    'dashboard_page_frivillig-liste',
                    'preferences'
                );
            }
        }
    }

    public static function renderPreferences($workers, $workType) { ?>
        <ul>
            <?php foreach ($workers as $e) { ?>
            <li data-id="<?= $e->id ?>"> ...  </li>
            <?php } ?>
        </ul>
        <?php
    }

    private static function renderGlobalSearchMetaBox() {
        ?> Søk: <input type="text" onkeydown="window.populateSearchFields(event)" placeholder="<?= __('i alle tabellene') ?>  "> <?php
    }
}

referensi

https://codex.wordpress.org/Dashboard_Widgets_API

Ярослав Рахматуллин
sumber