web-dev-qa-db-fra.com

Comment résoudre un problème “globals” pour éviter un thème rejeté?

Je soumets un thème WordPress pour Themeforest et l'une des raisons du rejet est la suivante:

Les globales doivent toujours appartenir à une fonction ou à une classe et doivent être utilisés de manière restrictive et uniquement si le thème en a vraiment besoin. Il est fortement recommandé de ne pas les utiliser du tout simplement pour garder des éléments en dehors de l'espace de noms global, car ils sont peu codés.

J'utilise Smof Option Framework pour les options de thème et voici un exemple de code provenant de l'un de mes fichiers de thème:

global $smof_data;
$td_header_manager_wide = $smof_data['td_header_blocks']['enabled'];

if ( $td_header_manager_wide ) {

        foreach ( $td_header_manager_wide as $key=>$value ) {

            switch( $key ) {

                case 'block_main_menu_wide': // wide menu
                echo '<div id="td-sticky" class="wide-menu ' . $td_sticky . '">';
                echo '<div id="wide-menu">';
                include( get_template_directory() . '/parts/menu-header-logo.php');
                echo '</div>';
                echo '</div>';
                break;
  }
}

Il semble que global $ smof_data ; devrait être dans une fonction mais je suis vraiment perdu ici comment accomplir cette tâche pour éviter d'inclure global $ smof_data; dans tous mes fichiers de thème où j'en ai besoin.

Mettre à jour le code en utilisant la méthode @jgraup:

function matilda_customize_styles() {

    $css = '<style type="text/css" media="screen">';
    if ( ! empty( SMOFData::get( 'td_body_font_family' ) ) 
        && SMOFData::get( 'td_body_font_family' ) != 'none' ) 
    {
        $css .= 'body{font-family:' . esc_html( SMOFData::get( 'td_body_font_family' ) ) . ';}';
    }

}

Toute aide est la bienvenue. Merci.

1
Knott

Si vous avez affaire à un cadre contenant des valeurs dans une variable globale, vous ne pouvez rien y faire. Voici un exemple d'habillage de la variable dans un getter statique.

if ( ! class_exists( 'SMOFData' ) ):

    class SMOFData {

        static public function is( $key, $compare ) {
            $value = static::get( $key );
            return $value === $compare;
        }

        static public function not( $key, $compare ) {
            $value = static::get( $key );
            return $value !== $compare;
        }

        static public function has( $key ) {
            $value = static::get( $key );
            return ! empty( $value );
        }

        static public function get( $key ) {

            global $smof_data;

            if ( ! isset( $smof_data ) ) {
                return null;
            }

            return isset( $smof_data[ $key ] ) ? $smof_data[ $key ] : null;
        }

    }

endif; // SMOFData

Pour accéder aux données, utilisez simplement

echo SMOFData::get('td_header_blocks')['enabled'];

function matilda_customize_styles() { 
    $css = '<style type="text/css" media="screen">';
    $td_body_font_family = SMOFData::get( 'td_body_font_family' ); 
    if ( ! empty( $td_body_font_family ) && $td_body_font_family != 'none' ) {
        $css .= 'body{font-family:' . esc_html( $td_body_font_family ) . ';}';
    } 
}

function matilda_customize_styles() { 
    $css = '<style type="text/css" media="screen">';
    if ( SMOFData::has( 'td_body_font_family' ) && SMOFData::not( 'td_body_font_family', 'none' ) ) {
            $css .= 'body{font-family:' . esc_html( SMOFData::get( 'td_body_font_family' ) ) . ';}';
    }
}

Si vous voulez juste que vous soyez vos propres globaux, vous pouvez aussi en faire une classe.

if ( ! class_exists( 'ThemeData' ) ):

    class ThemeData {
        private static $_values = array ();

        static public function get( $key ) {
            return isset( static::$_values[ $key ] ) ? static::$_values[ $key ] : null;
        }

        static public function set( $key, $value ) {
            static::$_values[ $key ] = $value;
            return $value;
        }
    }
endif; // ThemeData


// setter
ThemeData::set('foo', 'bar');

// getter
echo ThemeData::get('foo');
1
jgraup

Premièrement, je dois féliciter la réponse de Themeforest, qui mérite vraiment une bière. Les globales sont diaboliques et il ne faut jamais créer de globals et salir l’espace global qu’il est déjà. WordPress en a déjà fait un énorme gâchis. Ne pas ajouter à ce gâchis.

L'un des moyens les plus simples de résoudre le problème mondial consiste à créer une fonction que vous pouvez utiliser n'importe où, le cas échéant. Voici un échantillon

function this_is_my_global()
{
    return $my_global_var = 'This is my global value';
}

Vous pouvez alors simplement appeler this_is_my_global(); où vous en avez besoin.

C'est juste quelque chose de très basique. Je vous recommande de lire @kaiser et @gmazzap répond à la question suivante

Cela devrait donner un moyen plus complexe et fiable de passer des variables entre les modèles

3
Pieter Goosen