J'ai besoin de créer 3 pages personnalisées edit.php
qui affichent uniquement les pages avec un certain parent et le bouton Publier un nouveau lien vers une nouvelle page avec le parent correspondant.
La réponse la plus proche que je puisse faire est de ne pas éditer les fichiers core et de simplement supprimer les méta-boîtes, etc. Comment personnaliser les pages "admin" (edit.php) et "Edit Page" admin (post.php) pour la modification en bloc de contenu personnalisé type?
Mais je ne peux pas faire ça. Avez-vous des suggestions pour dupliquer la page edit.php
?
Jusqu'ici, j'ai dupliqué le code dans mon modèle mais il n'affiche aucune page:
Une solution de menu est possible, et je l’aborderai à la fin, mais une autre solution consiste à ajouter les liens personnalisés avec le hook views_edit-$post_type
.
Mon compte et Checkout sont deux pages parentes. Leurs liens utiliseront des ID de page codés en dur: edit.php?post_type=page&checkout=1669
et nous attraperons le paramètre $_GET['checkout']
pour appeler un hook pre_get_posts
.
# Called only in /wp-admin/edit.php* pages
add_action( 'load-edit.php', function()
{
# Not our post_type, bail out
if ( get_current_screen()->id != 'edit-page' )
return;
# Transient cache for pages IDs and Count
# used in both hooks bellow
do_cache_wpse_77721();
# Check if our Query Var is defined and activate pre_get_posts
if( isset( $_GET['account'] ) || isset( $_GET['checkout'] ) )
add_action( 'pre_get_posts', 'pre_posts_wpse_77721' );
add_filter( 'views_edit-page', 'custom_links_wpse_77721' );
});
/**
* Only display comments of specific post_id
*/
function pre_posts_wpse_77721( $query )
{
# Just to play safe, but I think the hook is quite specificaly called
if( !is_admin() )
return $query;
global $pagenow;
# If there's no cache, bail out
$cache = get_transient( 'custom_page_links' );
if( !$cache )
return $query;
# Define the IDs we want to query
if( isset( $_GET['account'] ) )
$ids = $cache['account']['ids'];
else
$ids = $cache['checkout']['ids'];
# Here, too, just playing safe
if( 'edit.php' == $pagenow && ( get_query_var('post_type') && 'page' == get_query_var('post_type') ) )
$query->set( 'post__in', $ids );
return $query;
}
/**
* Add link to specific post comments with counter
*/
function custom_links_wpse_77721( $status_links )
{
$cache = get_transient( 'custom_page_links' );
$count_checkout = sprintf(
'<span class="count">(%s)</span>',
$cache['checkout']['count']
);
$count_account = sprintf(
'<span class="count">(%s)</span>',
$cache['account']['count']
);
$link_account = 'edit.php?post_type=page&account=1670';
$link_checkout = 'edit.php?post_type=page&checkout=1669';
$link_all = '<a href="edit.php?post_type=page">All</a>';
$separator = 'CUSTOM LINKS ➽';
if( isset( $_GET['checkout'] ) )
{
$status_links['all'] = $link_all;
$status_links['my_sep'] = $separator;
$status_links['account'] = "<a href='$link_account'>My Account $count_account</a>";
$status_links['checkout'] = "<a href='$link_checkout' class='current'>Checkout $count_checkout</a>";
}
elseif( isset( $_GET['account'] ) )
{
$status_links['all'] = $link_all;
$status_links['my_sep'] = $separator;
$status_links['account'] = "<a href='$link_account' class='current'>My Account $count_account</a>";
$status_links['checkout'] = "<a href='$link_checkout'>Checkout $count_checkout</a>";
}
else
{
$status_links['my_sep'] = $separator;
$status_links['account'] = "<a href='$link_account'>My Account $count_account</a>";
$status_links['checkout'] = "<a href='$link_checkout'>Checkout $count_checkout</a>";
}
return $status_links;
}
/**
* Makes the query once every hour
* holds the Parent and Children ID, plus the Children total pages count
*/
function do_cache_wpse_77721()
{
if( !get_transient( 'custom_page_links' ) )
{
# Page 1
$checkout_posts = get_children( 'post_parent=1669&post_type=page' );
// To include the parent ID in the query
$c_ids = array( '1669' );
// Grab the children IDs
foreach( $checkout_posts as $check )
$c_ids[] = $check->ID;
$checkout = array(
'ids' => $c_ids,
'count' => count( $checkout_posts )
);
# Page 2
$account_posts = get_children( 'post_parent=1670&post_type=page' );
$a_ids = array( '1670' );
foreach( $account_posts as $acc )
$a_ids[] = $acc->ID;
$account = array(
'ids' => $a_ids,
'count' => count( $account_posts )
);
# Set transient
$transient = array(
'checkout' => $checkout,
'account' => $account
);
set_transient( 'custom_page_links', $transient, 60*60 );
}
}
Et voici comment ajouter un sous-menu à Pages, qui renvoie directement à l'une des pages parentes. Nous devons utiliser jQuery pour ajuster les états actif/inactif pour le menu et le sous-menu.
add_action('admin_menu', function()
{
add_submenu_page(
'edit.php?post_type=page',
'Checkout',
'Checkout',
'edit_pages',
'custom_parent_page',
function()
{
wp_redirect(admin_url('edit.php?post_type=page&checkout=1669'));
exit;
}
);
});