web-dev-qa-db-fra.com

Est-il possible de manipuler la liste des modèles de page?

Après avoir répondu à cette question , je me suis demandé s'il était possible de manipuler la liste déroulante des modèles de page possibles lors de la modification d'une page. WordPress dérive cette liste des fichiers modèles disponibles dans le répertoire racine (tels que page.php, page-onecolumn.php, page-about-us.php). Il ne semble pas que la liste soit stockée dans la base de données.

J'imagine qu'il existe des raisons légitimes de vouloir cela, par exemple si vous avez dix modèles de page, mais que vous souhaitez limiter l'accès à certains d'entre eux pour les utilisateurs non-administrateurs. Ou peut-être souhaitez-vous créer des modèles de manière dynamique via une page d'option afin d'élargir la liste.

5
cjbj

Le bourreau de travail est WP_Theme::get_page_templates() (entouré par la fonction d'assistance get_page_templates() ). Si vous consultez la source, vous verrez:

/**
 * Filter list of page templates for a theme.
 *
 * @since 3.9.0
 * @since 4.4.0 Converted to allow complete control over the `$page_templates` array.
 *
 * @param array        $page_templates Array of page templates. Keys are filenames,
 *                                     values are translated names.
 * @param WP_Theme     $this           The theme object.
 * @param WP_Post|null $post           The post being edited, provided for context, or null.
 */
return (array) apply_filters( 'theme_page_templates', $page_templates, $this, $post );

Exemple:

function wpse_226324_page_templates( $templates ) {
    // Remove tpl-home.php template
    unset( $templates['tpl-home.php'] );

    // Add custom template
    $templates['tpl-custom.php'] = 'Custom Template';

    return $templates;
}

add_filter( 'theme_page_templates', 'wpse_226324_page_templates' );

Voir aussi theme_page_templates référence de code .

5
TheDeadMedic