เพิ่มตัวเลือกหน้าจอให้กับหน้าผู้ดูแลระบบที่กำหนดเอง


13

ฉันต้องการเพิ่มตัวเลือกหน้าจอในหน้าการตั้งค่าปลั๊กอินของฉันเช่นตัวเลือกที่มีอยู่ในแผงควบคุม

ป้อนคำอธิบายรูปภาพที่นี่

ฉันลองใช้add_optionวิธีของWP_Screenวัตถุและพบว่ารองรับเพียงสองตัวเลือก และper_pagelayout_columns

ไม่มีใครรู้ว่าตัวเลือกหน้าจอใดที่จะใช้เพื่อรับตัวเลือกเช่นเดียวกับในหน้าแดชบอร์ด

แก้ไข :

ให้ฉันอธิบายสิ่งที่ฉันพยายามเล็กน้อย

ฉันมีส่วนที่แตกต่างกันในปลั๊กอินการลบข้อมูลจำนวนมากและแต่ละส่วนช่วยให้ผู้คนลบโพสต์ตามเกณฑ์บางอย่าง (เช่นหมวดหมู่แท็กแท็กอนุกรมวิธานที่กำหนดเอง ฯลฯ ) ฉันต้องการให้ผู้ใช้เลือกส่วนที่พวกเขาต้องการใช้และส่วนที่พวกเขาต้องการซ่อนคล้ายกับหน้าแดชบอร์ดที่ผู้ใช้สามารถเลือกวิดเจ็ตแดชบอร์ดที่พวกเขาต้องการที่จะเห็นและที่จะซ่อน

ตอนนี้เพื่อที่จะใช้สิ่งนี้ฉันต้องการที่จะแสดงรายการของช่อง (หนึ่งสำหรับแต่ละส่วน) และให้ผู้ใช้เลือกที่จะแสดง

เพื่อแสดงรายการช่องทำเครื่องหมายฉันต้องเรียกadd_optionวิธีการของWP_Screenวัตถุ เมื่อฉันทำอย่างนั้นฉันก็พบว่าขณะนี้add_optionฟังก์ชั่นรองรับเฉพาะสองประเภทนี้เท่านั้นและส่วนอื่น ๆ จะไม่สนใจ

  • ต่อหน้า
  • layout_columns

แต่จะปรากฏเฉพาะในหน้าแดชบอร์ด ฉันต้องการทราบวิธีการทำซ้ำสิ่งที่คล้ายกันในส่วนตัวเลือกหน้าจอของหน้าผู้ดูแลระบบที่กำหนดเองของฉันเช่นกัน


ใช่แท็บตัวเลือกหน้าจอดูเหมือนว่าไม่สามารถยอมรับได้ ... แล้วการแย่งชิงแท็บวิธีใช้จะทำเช่นนั้นได้อย่างไร
brasofilo

คำตอบ:


6

คุณไม่จำเป็นต้องคิดค้นแถวตัวเลือกหน้าจอใหม่ เพียงแค่ใช้สารที่เหมาะสม

ขณะนี้คุณกำลังวาดภาพหลอกหลอก:

<!-- 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>

คุณควรทำสิ่งนี้:

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

จากนั้นลงทะเบียน metaboxes add_meta_box()ของคุณเองด้วย

อ่านMeta Boxes บน Custom PagesจากStephen Harrisสำหรับรายละเอียดทั้งหมด ( ตัวอย่างบน GitHub )
จุดสำคัญคือคุณจะได้รับตัวเลือกหน้าจอสำหรับกล่องเหล่านี้ได้ฟรี

และเมื่อ WordPress เปลี่ยนมาร์กอัปภายในสำหรับ metaboxes หนึ่งวันรหัสของคุณอาจยังใช้งานได้เพราะคุณใช้ API


ขอบคุณสำหรับรหัสและลิงค์ แก้ไขปลั๊กอินของฉันเพื่อรวมตอนนี้
Sudar

4

คุณสามารถทำได้โดยใช้ตัวกรองที่เหมาะสมภายใน\WP_Screenชั้นเรียน เพียงให้แน่ใจว่าคุณไม่เปลี่ยนมันบนต่อค่าเริ่มต้น:

วิธีแสดงหรือซ่อนแท็บ

ตัวกรองต่อไปนี้แสดงวิธีการแสดงหรือซ่อนแท็บ จริงๆแล้วเนื่องจากมีตัวกรองที่ดีกว่าวิธีต่อไปนี้จะใช้งานได้มากกว่าถ้าคุณต้องการบังคับให้ซ่อนแท็บเมื่อมีอยู่แล้ว:

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

วิธีแสดงแท็บและเพิ่มเนื้อหาที่กำหนดเอง

ต่อไปนี้แสดงแท็บการตั้งค่าที่มีฟิลด์ป้อนข้อมูลที่เก็บค่าamountที่คุณสามารถใช้ในหน้าเว็บของคุณ (เช่น จำกัด ผลลัพธ์ของการ$wpdbค้นหา)

/**
 * @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 );

1

นี่คือตัวอย่างที่กระชับและรัดกุมขึ้นอยู่กับMeta Boxes บน Custom Pages โดย Stephen Harris :

รหัสเดียวกันกับส่วนสำคัญ

<?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:          jazzoslav@gmail.com
 * 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
    }
}

การอ้างอิง

https://codex.wordpress.org/Dashboard_Widgets_API

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.