it-swarm-es.com

¿Qué es option_name en la base de datos que almacena la información del widget de inicio actual en la barra lateral del frontend?

¿Qué es option_name en la base de datos que almacena la información del widget de inicio actual en la barra lateral del frontend?

1
justjoe

Resuelto Lo que dijo EAmann es correcto. El problema está en la configuración del sistema de widgets en WordPress. Para cada widget de múltiples instancias, como texto, la información se almacena en un nombre de opción diferente donde el valor de cada widget se almacena de manera serializada.

El truco está en cómo almacenamos la información del widget de texto serializado que a veces tiene caracteres especiales. Debemos utilizar heredoc. El uso de heredoc es evitar la situación cuando una cadena debe contener ['] y ["], porque ambas no pueden usarse juntas en una línea.

$serialize_sidebar_widgets = <<< EOD
a:7:{s:19:"wp_inactive_widgets";a:0:{}s:9:"sidebar-1";a:1:{i:0;s:6:"text-3";}s:9:"sidebar-2";a:0:{}s:9:"sidebar-3";a:0:{}s:9:"sidebar-4";a:0:{}s:9:"sidebar-5";a:0:{}s:13:"array_version";i:3;}
EOD;

$serialize_widgets_text = <<< EOD
a:3:{i:2;a:0:{}i:3;a:3:{s:5:"title";s:5:"hello";s:4:"text";s:21:"saya hellokankamu yah";s:6:"filter";b:0;}s:12:"_multiwidget";i:1;}
EOD;

Ahora podemos almacenarlos en la base de datos:

$wpdb->update( $wpdb->options, array( 'option_value' => $serialize_sidebar_widgets ), array( 'option_name' => 'sidebars_widgets' ) );
$wpdb->update( $wpdb->options, array( 'option_value' => $serialize_widgets_text ), array( 'option_name' => 'widget_text' ) );

PD: Si almacenamos widgets de múltiples instancias, deberíamos recordar que los widgets tienen su propia configuración. Por ejemplo, el widget de texto se almacena en 'widget_text'

PS: Lee cómo usar heredoc en PHP .

2
justjoe

Los widgets de la barra lateral se almacenan en varios lugares en la base de datos. Para ser perfectamente honesto, creo que sería casi imposible que su tema cree una barra lateral precargada y widgetizada cuando se instala por primera vez.

Sin embargo , todavía hay una manera de configurar una visualización predeterminada de widgets para cuando instala un tema la primera vez. Si echas un vistazo al tema TwentyTen predeterminado, verás que define una lista de widgets "predeterminados" que se cargarán si el usuario no tiene una barra lateral dinámica:

<div id="primary" class="widget-area" role="complementary">
    <ul class="xoxo">
    <?php
        /* When we call the dynamic_sidebar() function, it'll spit out
         * the widgets for that widget area. If it instead returns false,
         * then the sidebar simply doesn't exist, so we'll hard-code in
         * some default sidebar stuff just in case.
         */
        if ( ! dynamic_sidebar( 'primary-widget-area' ) ) : ?>

            <li id="search" class="widget-container widget_search">
                <?php get_search_form(); ?>
            </li>

            <li id="archives" class="widget-container">
                <h3 class="widget-title"><?php _e( 'Archives', 'twentyten' ); ?></h3>
                <ul>
                    <?php wp_get_archives( 'type=monthly' ); ?>
                </ul>
            </li>

            <li id="meta" class="widget-container">
                <h3 class="widget-title"><?php _e( 'Meta', 'twentyten' ); ?></h3>
                <ul>
                    <?php wp_register(); ?>
                    <li><?php wp_loginout(); ?></li>
                    <?php wp_meta(); ?>
                </ul>
            </li>

    <?php endif; // end primary widget area ?>
    </ul>
</div><!-- #primary .widget-area -->

Este bloque de código codifica para un widget de búsqueda, un widget de archivos y un meta widget. Bastante básico, pero significa que los nuevos blogs siempre mostrarán algo útil en la barra lateral, incluso si el propietario todavía no ha tenido la oportunidad de personalizar el sitio.

Si está grabando para crear "una lista de widgets que se instala automáticamente cuando un tema se registra por primera vez", esta es la forma más segura y amigable de hacerlo.

2
EAMann