Je souhaite ajouter des options d'écran à ma page de paramètres de plug-in, comme celles disponibles dans le tableau de bord.
J'ai essayé d'utiliser la méthode add_option
de l'objet WP_Screen
et j'ai constaté qu'il ne prend en charge que deux options. per_page
et layout_columns
.
Est-ce que quelqu'un sait quelle option d'écran utiliser pour obtenir des options comme celle de la page Tableau de bord?
Modifier :
Laissez-moi expliquer ce que j'essaie un peu.
J'ai plusieurs sections dans mon Bulk Delete Plugin et chaque section permet aux gens de supprimer des publications en fonction de certains critères (comme la catégorie, les balises, la taxonomie personnalisée, etc.). Je souhaite laisser les utilisateurs choisir les sections qu'ils souhaitent utiliser et celles qu'ils souhaitent masquer, comme la page Tableau de bord, où les utilisateurs peuvent choisir les widgets de tableau de bord à afficher et ceux à masquer.
Maintenant, pour implémenter cela, je veux montrer une liste de cases à cocher (une pour chaque section) et laisser l’utilisateur choisir laquelle afficher.
Pour afficher la liste des cases à cocher, j'ai dû appeler la méthode add_option
de l'objet WP_Screen
. En faisant cela, j’ai réalisé que la fonction actuelle add_option
ne prend en charge que ces deux types et que les autres sont simplement ignorés.
Cependant, seules les cases à cocher de la page du tableau de bord sont affichées. Je souhaite également savoir comment répliquer un élément similaire dans la section des options d'écran de ma page d'administration personnalisée.
Vous n'avez pas besoin d'inventer une nouvelle ligne d'option d'écran. Il suffit d'utiliser des métaboxes appropriés.
Actuellement, vous dessinez des pseudo-métaboxes:
<!-- 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>
Vous devriez faire ceci:
<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>
Puis enregistrez vos propres métaboxes avec add_meta_box()
.
Lisez Les méta-boîtes sur des pages personnalisées à partir de Stephen Harris pour tous les détails ( démo sur GitHub ).
Le point principal est: Vous obtiendrez les options d’écran pour ces boîtes gratuitement.
Et lorsque WordPress change le balisage interne des métaboxes un jour, votre code fonctionnera probablement encore, car vous avez utilisé l'API.
Vous pouvez le faire en utilisant le filtre approprié dans la classe \WP_Screen
. Assurez-vous simplement de ne pas l'activer sur par défaut:
Le filtre suivant montre comment afficher ou masquer l'onglet. En fait, comme il existe un meilleur filtre, le moyen suivant est plus utile si vous devez forcer masquer l'onglet lorsqu'il existe déjà:
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 );
Ce qui suit montre un onglet de paramètres contenant un champ de saisie contenant la valeur amount
que vous pouvez utiliser de quelque manière que ce soit sur votre page (par exemple, limiter les résultats de la requête $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 );
Voici un exemple complet et concis basé sur la Meta Boxes sur des pages personnalisées de Stephen Harris :
Même code qu'un Gist
<?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
}
}