¿Cómo hago para que mi tema hijo vuelva a aplicar la configuración personalizada cuando su padre estaba activo?

17

Guión

  1. Elige el tema 2015. Personalice varias configuraciones, como imagen de fondo, imagen de encabezado, nombre del sitio y lema.
  2. Pero no toque el contenido de ninguno de los archivos del tema.
  3. Use los Temas secundarios del Codex para crear un tema secundario mínimo del tema 2015.
  4. Activa el nuevo tema hijo.

Ups?

El sitio con este tema secundario mínimo básico activado se ve completamente diferente del tema principal. El fondo y la imagen del encabezado desaparecieron y se activaron todos los widgets de la barra lateral (o encabezado) que no estaban activos (de manera predeterminada) en el tema padre 2015.

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

SofietjeWonders con tema personalizado 2015

El sitio como se ve con el tema secundario derivado del tema 2015, que tiene solo el encabezado requerido style.cssy solo pone en cola los estilos como lo sugiere la página Tema secundario del Codex en su function.php.

ingrese la descripción de la imagen aquí

Pregunta

¿Cómo hago para que la activación del tema secundario mantenga las personalizaciones y los valores predeterminados del tema principal?

En este caso: el encabezado y las imágenes de fondo y la eliminación (¿desactivación?) De los widgets predeterminados (barra lateral / encabezado).


Notas

Crear un tema secundario de un tema personalizado ya pesado puede parecer un duplicado, pero se trata de personalizaciones editando los archivos del tema.

Esta pregunta Al activar un tema secundario, ¿qué configuraciones principales deben restablecerse, es decir; Menús personalizados, etc. Parece preguntar exactamente lo que parece ser después. Desafortunadamente, la única respuesta especula sobre una falta de coincidencia en las características, que no es el caso para mí y no captó el comentario del OP en el mismo sentido.

Yo también miré

Marjan Venema
fuente

Respuestas:

9

Le di un +1 a la respuesta de @ webtoure porque te da la dirección correcta, sin embargo, creo que carece de algunas verificaciones.

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

Según tengo entendido de OP, se requieren estas condiciones.

Además, un problema que debe tener en cuenta es qué hacer con las modificaciones del tema del tema secundario que se está activando, si ya existen.

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

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

En resumen, las condiciones que quiero comprobar antes para heredar modificaciones de tema del tema principal son:

  • el tema activo anteriormente debe ser el padre del tema secundario que se está activando
  • el tema hijo que se está activando nunca se ha activado antes

Para asegurar la segunda condición, usaré una opción personalizada, porque WordPress no proporciona una forma de hacer esta verificació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 );
gmazzap
fuente
Su primer punto de preocupación no está realmente justificado: si el tema actual no es un tema secundario get_template, simplemente devolverá el nombre de directorio del tema actual. No necesita saber la relación entre el tema activo anteriormente y el actual: si el tema tiene un padre, carga esa configuración; de lo contrario, solo carga su propia configuración. Sin embargo, estoy de acuerdo con su segundo punto que aborda el problema de la sobrescritura de la configuración.
webtoure
Además, ¿qué sucede si el usuario activa accidentalmente otro tema antes de activar el tema secundario deseado? El código no funcionará y la relación ( theme_switched, current_theme) es irrelevante para empezar.
webtoure
1
@MarjanVenema Estaré muy feliz si le das recompensas a webtoure .
gmazzap
1
@MarjanVenema gmazzap en realidad proporcionó comentarios para su proceso de pensamiento y también sugirió una corrección a mi fragmento. Creo que si alguien merece la recompensa, es él. Además, no contesto preguntas por puntos completamente inútiles. Me encanta: interactuar con personas, desafíos y, en general, ayudar cuando puedo.
webtoure
1
Por favor, mantenga discusiones extendidas para chatear, los comentarios no son para ellos. :)
Rarst