web-dev-qa-db-fra.com

Comment créer une page personnalisée edit.php/edit

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:

 custom edit page 

4
ptimson

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.

views_edit

# 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 &#x27BD;';

    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; 
        }
    );
});
2
brasofilo