C'è un modo per cambiare la selezione predefinita del template di pagina?
Clicca su "Pagine" -> Clicca su "Aggiungi nuova"
Nella schermata aggiungi nuova pagina, il template predefinito selezionato è "Template predefinito". C'è un modo per cambiare l'opzione predefinita in, per esempio, "Il Mio Altro Template"? In modo che quando clicco su "Aggiungi nuova", "Il Mio Altro Template" sia sempre selezionato di default? Questo deve essere fatto prima che la pagina venga salvata. Posso farlo con JS. Esiste un'opzione WordPress?
AGGIORNAMENTO:
Ecco un esempio:
Opzioni Template:
- Template Predefinito (selezionato automaticamente)
- Il Mio Template 1
- Il Mio Template 2
Esiste un modo in WordPress per cambiare in:
- Template Predefinito
- Il Mio Template 1 (selezionato automaticamente)
- Il Mio Template 2
Ho pensato che forse questo potrebbe essere realizzato con una funzione:
if (alcune condizioni sono soddisfatte)
template_predefinito = Il Mio Template 1
endif
So come funziona la gerarchia dei template. So come fare in modo che il mio template venga sempre utilizzato per determinate pagine. Ma questa non è la domanda. Sto solo cercando di rendere le cose più facili per l'utente finale in modo che, in determinate condizioni, possa preselezionare il template che dovrebbe essere utilizzato su un gruppo di pagine, ma dare comunque all'utente la flessibilità di tornare a un altro template se necessario.
Utilizzare template_include
(come suggerito da Brad Dalton) modifica solo il template della pagina sul front end, non nell'admin durante la modifica di una pagina.
D'altra parte, cambiare il valore nell'oggetto post prima che il metabox venga renderizzato, come suggerito da czerspalace, funziona! Ho aggiunto un controllo per applicare questo solo quando $post->page_template
non è impostato, in questo modo:
function wpse196289_default_page_template() {
global $post;
if ( 'page' == $post->post_type
&& 0 != count( get_page_templates( $post ) )
&& get_option( 'page_for_posts' ) != $post->ID // Non la pagina per elencare i post
&& '' == $post->page_template // Solo quando page_template non è impostato
) {
$post->page_template = "page-mytemplate.php";
}
}
add_action('add_meta_boxes', 'wpse196289_default_page_template', 1);

Il codice sopra dovrebbe funzionare nel file functions.php del tuo tema (o in un plugin personalizzato). Devi cambiare la stringa page-mytemplate.php
con un nome che corrisponda al template di pagina desiderato nel tuo tema.

Mi hai ispirato a farlo nel nuovo editor a blocchi (Gutenberg) usando il filtro "rest_prepare_{$post_type}".

Non ho testato questo codice, ma potrebbe funzionare. Il template viene scelto in base a un valore nell'oggetto post globale, quindi dobbiamo modificare quel valore nell'oggetto post prima che il metabox venga renderizzato. Il codice che sceglie il dropdown predefinito si trova qui: https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/meta-boxes.php#L751
add_action('add_meta_boxes', 'wpse196289_default_page_template', 1);
function wpse196289_default_page_template() {
global $post;
if ( 'page' == $post->post_type && 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID ) {
if( $my_conditions )
$post->page_template = "page-mytemplate.php";
}
}

Il modo più semplice che ho trovato, senza modificare il codice, è creare un file page.php separato (lontano dai tuoi file page_template-name.php) e utilizzare get_template_part() per reindirizzare al tuo file template. Questo fornisce il template predefinito per tutto il sito, mantenendo comunque il template come opzione discreta.
<?php get_template_part('page_template-name'); ?>
Questo è tutto ciò che deve esistere nel tuo file page.php. Semplicemente richiama il tuo template predefinito. Se vuoi cambiare il template per tutto il sito, puoi semplicemente modificare lo slug. Qualsiasi pagina che ha l'opzione predefinita selezionata verrà modificata. Qualsiasi pagina impostata specificamente per utilizzare un template diverso (cioè impostata su template-1 invece che predefinito), non cambierà.

Sono riuscito a implementarlo nel nuovo editor a blocchi (Gutenberg).
In questo caso il compito richiede un hook nella risposta dell'API REST.
Ho preso le condizioni dalla risposta di Adrian.
foreach ( array( 'page', 'post' ) as $post_type ) :
add_filter( "rest_prepare_{$post_type}", 'wpse196289_rest_set_default_page_template', 1, 2 );
endforeach;
function wpse196289_rest_set_default_page_template( $data, $post ) {
if ( 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID && '' == $data->data['template'] ) :
$data->data['template'] = 'page-mytemplate.php';
endif;
return $data;
}

Quando ho implementato questo codice, l'editor impostava il mio template su quello specificato, tuttavia ricevevo messaggi di "Aggiornamento fallito" ogni volta che cercavo di aggiornare.

Questo codice romperà il sito e sarà necessario reinstallarlo nuovamente.

Utilizza template_include
nel tuo file functions.php con un conditional tag.
add_filter( 'template_include', 'default_page_template', 99 );
function default_page_template( $template ) {
// Verifica se è una pagina singola
if ( is_singular( 'page' ) ) {
// Cerca il template 'default-page-template.php' nella cartella del tema
$default_template = locate_template( array( 'default-page-template.php' ) );
if ( '' != $default_template ) {
return $default_template;
}
}
return $template;
}

Per me ha funzionato:
function wpse196289_default_page_template() {
global $post;
if ( 'page' == $post->post_type
&& 0 != count( get_page_templates( $post ) )
&& get_option( 'page_for_posts' ) != $post->ID // Non è la pagina per elencare gli articoli
&& '' == $post->page_template // Solo quando page_template non è impostato
) {
//print_r(get_page_templates( $post )); ottieni l'elenco dei template
//Array([Elementor Canvas] => elementor_canvas [Elementor Full Width] => elementor_header_footer [Theme] => elementor_theme)
$post->page_template = "elementor_header_footer"; // imposta il template che desideri
}
}
add_action('add_meta_boxes', 'wpse196289_default_page_template', 1);
