Skip to main content

Activar i desinstal·lar un plugin

Afegirem una pàgina de configuració i integrar-la amb la base de dades, per fer-ho implementarem la funcionalitat per permetre als usuaris canviar el color per defecte del banner.

Això requerirà modificar tres parts del plugin "Banner Personalitzat":

  1. Activació/Desactivació: Crear i eliminar la taula de la base de dades.

  2. Administració: Afegir el menú i la pàgina de configuració.

  3. Shortcode: Recuperar el color per defecte de la nova taula de la BBDD.

Introduirem els següents canvis al plugin:

  • Crea una taula de configuració en activar-se.

  • Mostra una pàgina de configuració a l'administració per guardar un nou color.

  • Utilitza el color guardat com a valor per defecte del shortcode.

  • Neteja la taula de la BBDD en desinstal·lar-se.

Gestió base dades (Activació i Desinstal·lació)

Modificarem el fitxer principal banner-personalitzat.php per gestionar les funcions d'activació i desinstal·lació.

Creació taula (bp_activar_plugin)

Utilitzarem la funció especial register_activation_hook per executar el codi que crea la taula.

PHP
// Fitxer: banner-personalitzat.php

// ... [El codi de definició de constants i càrrega d'assets ja existent] ...

// 1. Funció d'Activació: Crea la taula
function bp_activar_plugin() {
    global $wpdb;
    
    // El nom de la taula (prefix de WP + nom propi)
    $taula_nom = $wpdb->prefix . 'bp_configuracio';
    
    // Incloure el fitxer d'actualització de WordPress (necessari per a dbDelta)
    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    
    // Consulta SQL per crear la taula
    $sql = "CREATE TABLE $taula_nom (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        opcio_clau varchar(50) NOT NULL,
        opcio_valor varchar(50) NOT NULL,
        PRIMARY KEY (id),
        UNIQUE KEY opcio_clau (opcio_clau)
    ) $wpdb->charset_collate;";
    
    // Executar la consulta
    dbDelta( $sql );
    
    // Inserir el valor per defecte del color si la taula és nova
    $wpdb->insert( 
        $taula_nom, 
        array( 
            'opcio_clau'  => 'color_per_defecte', 
            'opcio_valor' => '#0073aa' // Color blau per defecte inicial
        ) 
    );
}
register_activation_hook( __FILE__, 'bp_activar_plugin' );


// 2. Funció de Desinstal·lació: Elimina la taula
function bp_desinstal_plugin() {
    global $wpdb;
    $taula_nom = $wpdb->prefix . 'bp_configuracio';
    
    // Consulta SQL per eliminar la taula
    $sql = "DROP TABLE IF EXISTS $taula_nom";
    $wpdb->query( $sql );
}
// NOTA: Cal registrar-la com a hook d'uninstall per esborrar-la de la BBDD quan 
// l'usuari tria 'Esborrar' el plugin.
register_uninstall_hook( __FILE__, 'bp_desinstal_plugin' );

Pàgina configuració administració

Crearem un nou fitxer per a la lògica de l'administració i definirem el menú i el formulari.

Arxiu lògica (includes/admin.php)

Crea el fitxer includes/admin.php i afegeix-lo a la càrrega del teu fitxer principal banner-personalitzat.php:

PHP
// Fitxer: banner-personalitzat.php

// ... [Abans de carregar el shortcode.php] ...

// Carregar fitxers de lògica de l'administració
require_once( BP_PATH . 'includes/admin.php' ); 

// ...

Implementació pàgina

El fitxer includes/admin.php contindrà:

  1. La funció per afegir el menú.

  2. La funció per gestionar la presentació (HTML) de la pàgina.

  3. La funció per guardar la informació del formulari.

PHP
<?php
// Fitxer: includes/admin.php

// Funció per afegir el menú d'administració
function bp_menu_administracio() {
    add_menu_page(
        'Configuració del Banner', // Títol de la pàgina
        'Config. Banner',          // Text del menú
        'manage_options',          // Capacitat requerida
        'bp-configuracio',         // Slug del menú
        'bp_pagina_configuracio',  // Funció que mostra el contingut
        'dashicons-art',           // Icona
        60                         // Posició (a prop dels Posts)
    );
}
add_action( 'admin_menu', 'bp_menu_administracio' );


// Funció per guardar els valors del formulari
function bp_gestionar_post() {
    // 1. Verificar si s'ha enviat el formulari
    if ( isset( $_POST['bp_submit'] ) ) {
        // 2. Comprovar el nonce de seguretat
        if ( ! isset( $_POST['bp_configuracio_nonce'] ) || 
             ! wp_verify_nonce( $_POST['bp_configuracio_nonce'], 'bp_guardar_color' ) ) {
            return; // Fallada de seguretat
        }

        // 3. Comprovar permisos de l'usuari
        if ( ! current_user_can( 'manage_options' ) ) {
            return;
        }

        // 4. Netejar i guardar el nou valor
        global $wpdb;
        $taula_nom = $wpdb->prefix . 'bp_configuracio';
        $nou_color = sanitize_text_field( $_POST['bp_color_per_defecte'] );
        
        $wpdb->update( 
            $taula_nom, 
            array( 'opcio_valor' => $nou_color ), 
            array( 'opcio_clau' => 'color_per_defecte' ) 
        );

        // Mostrar missatge de confirmació
        add_settings_error( 'bp_missatges', 'bp_missatge_guardat', 'Configuració desada correctament.', 'success' );
    }
}
// Hook per processar l'enviament del formulari a temps.
add_action( 'admin_init', 'bp_gestionar_post' ); 


// Funció que mostra el contingut HTML de la pàgina de configuració
function bp_pagina_configuracio() {
    global $wpdb;
    $taula_nom = $wpdb->prefix . 'bp_configuracio';
    
    // Recuperar el valor actual de la base de dades
    $color_actual = $wpdb->get_var( 
        $wpdb->prepare( "SELECT opcio_valor FROM $taula_nom WHERE opcio_clau = %s", 'color_per_defecte' )
    );

    ?>
    <div class="wrap">
        <h2>Configuració del Banner Personalitzat</h2>
        
        <?php settings_errors( 'bp_missatges' ); ?>

        <form method="post" action="">
            <?php 
            // Camp de seguretat (Nonce)
            wp_nonce_field( 'bp_guardar_color', 'bp_configuracio_nonce' ); 
            ?>
            
            <table class="form-table">
                <tr>
                    <th scope="row">
                      <label for="bp_color_per_defecte">Color per Defecte del Banner</label>
                    </th>
                    <td>
                        <input name="bp_color_per_defecte" type="text" id="bp_color_per_defecte" 
                               value="<?php echo esc_attr( $color_actual ); ?>" class="regular-text" />
                        <p class="description">Introdueix un codi de color hexadecimal (Ex: #FF0000).</p>
                    </td>
                </tr>
            </table>
            
            <p class="submit">
                <input type="submit" name="bp_submit" id="submit" 
                  class="button button-primary" value="Desar Canvis">
            </p>
        </form>
    </div>
    <?php
}

 

Recuperació del color al shortcode

Finalment, cal actualitzar el fitxer includes/shortcode.php perquè, quan l'usuari no especifiqui un color en el shortcode, es busqui el valor per defecte a la taula.

 

Funció auxiliar per recuperar el color

Afegirem una petita funció per obtenir el color.

PHP
// Fitxer: includes/shortcode.php

/**
 * Funció auxiliar per obtenir el color per defecte de la BBDD
 * @return string Color hexadecimal per defecte
 */
function bp_obtenir_color_per_defecte() {
    global $wpdb;
    $taula_nom = $wpdb->prefix . 'bp_configuracio';

    $color = $wpdb->get_var( 
        $wpdb->prepare( "SELECT opcio_valor FROM $taula_nom WHERE opcio_clau = %s", 'color_per_defecte' )
    );
    
    // Retorna el color o un color de reserva si no es troba
    return $color ? $color : '#0073aa';
}

// Funció que processa el shortcode [banner]
function bp_shortcode_banner( $atts, $content = null ) {
    
    // 1. Definir els valors per defecte dels paràmetres
    $color_default_db = bp_obtenir_color_per_defecte(); // <--- OBTENIM EL COLOR DE LA BBDD
    
    $params = shortcode_atts( 
        array(
            'titol'   => 'Benvingut!', 
            'tipus'   => 'informatiu', 
            'color'   => $color_default_db, // <--- ÚS DEL COLOR DE LA BBDD
        ), 
        $atts, 
        'banner' 
    );
    
    // ... [La resta del codi del shortcode segueix igual] ...
    
    extract( $params );
    $content = do_shortcode( $content ); 

    ob_start();
    include BP_PATH . 'templates/banner-template.php'; 
    $output = ob_get_clean();

    return $output;
}
// ...