¿Cómo hago que el tema de mi hijo vuelva a aplicar la configuración que se personalizó cuando su padre estaba activo?

14

Escenario

  1. Elige el tema 2015. Personalice varias configuraciones, como imagen de fondo, imagen de encabezado, nombre del sitio y lema.
  2. Pero no toques el contenido de ninguno de los archivos del tema.
  3. Use Temas infantiles de Codex para crear un tema infantil mínimo básico del tema de 2015.
  4. Activar el nuevo tema secundario.

Oops?

El sitio con este tema secundario mínimo activo activado se ve completamente diferente del tema principal. La imagen de fondo y del encabezado se había ido, y se había activado toda clase de widgets de barra lateral (o encabezado) que no estaban activos (de forma predeterminada) en el tema principal de 2015.

Aspecto original del sitio con solo algunas configuraciones personalizadas para el tema 2015:

Elsitiocomoseveconeltemasecundarioderivadodeltema2015,quetienesoloelencabezadorequeridoenstyle.cssysoloencolalosestilossugeridosporlapáginaTemainfantildelCodexensufunction.php.

Pregunta

¿Cómohagoparaquelaactivacióndeltemasecundariomantengalaspersonalizacionesylosvalorespredeterminadosdeltemaprincipal?

Enestecaso:elencabezadoylasimágenesdefondoylaeliminación(¿desactivación?)deloswidgetspredeterminados(barralateral/encabezado).

Notas

Cree un tema secundario de un ya El tema personalizado pesado puede sonar como un duplicado, pero se trata de personalizaciones al editar los archivos del tema.

Esta pregunta Al activar un tema secundario, se deben restablecer las configuraciones básicas, es decir; ¿Los menús personalizados, etc.? parecen preguntar exactamente qué es lo que parece que estoy buscando. Desafortunadamente, la única respuesta especula acerca de una falta de coincidencia en las características, lo cual no es el caso para mí y no detectó el comentario del OP con el mismo efecto.

También miré

pregunta Marjan Venema 05.08.2015 - 13:32

1 respuesta

8

Le di un +1 a la respuesta de @ webtoure porque te da la dirección correcta, sin embargo, creo que le faltan algunos controles.

En primer lugar, no comprueba que el tema que se está activando sea un tema secundario, y no comprueba que el tema previamente activo sea el tema principal del tema secundario que se está activando.

Según mi entendimiento de OP, estas condiciones son necesarias.

Además, una cuestión que debe tener en cuenta es qué hacer con las modificaciones de tema del tema secundario que se está activando, si ya existen.

En la respuesta de @webtoure, se almacenan en una copia de seguridad, lo que podría ahorrarle en algunas circunstancias, pero WordPress no los reconocerá de forma predeterminada y, por lo tanto, requieren que se utilice un código adicional.

Creo que sería mejor, heredar las modificaciones del tema del tema principal solo la primera vez se activa un tema secundario.

En resumen, las condiciones que deseo verificar antes de heredar las modificaciones de tema del tema principal son:

  • el tema previamente activo debe ser el padre del tema secundario que se está activando
  • el tema secundario que se está activando nunca se debe activar antes

Para garantizar la segunda condición, usaré una opción personalizada, porque WordPress no proporciona una manera de realizar esta comprobación.

Este es el código, lea los comentarios en línea para obtener una explicación de lo que está sucediendo:

add_action( 'switch_theme', function( $new_name, \WP_Theme $new_theme ) {

    // get the previously active theme
    $previous = get_option( 'theme_switched', -1 );

    // get the parent of current theme, will be false if no parent
    $parent = $new_theme->parent() ? $new_theme->get_template() : false;

    // current stylesheet name
    $stylesheet = get_option( 'stylesheet' );

    // has the theme being activated ever been activated before?
    $lastActive = get_option( $stylesheet . '_last_active', false );

    // if previouly active theme is the parent of the the child theme being activated
    // and it has never been activated before..
    if ( ! $lastActive && $parent === $previous ) {

        // update "last_active" option so following code won't run again for this theme
        update_option( $stylesheet . '_last_active', current_time( 'timestamp', 1 ) );

        // get the theme mods of the parent
        $previousMods = get_option( 'theme_mods_' . $parent, array() );

        // inherit current theme mods from parent theme mods
        update_option( 'theme_mods_' . $stylesheet, $previousMods );
    }

}, 10, 2 );
    
respondido por el gmazzap 09.08.2015 - 23:58

Lea otras preguntas en las etiquetas