web-dev-qa-db-ja.com

拒否されたテーマを回避するために「グローバル」問題を修正する方法

ThemeforestのWordPressテーマを送信しましたが、拒否の理由の1つは次のとおりです。

グローバルは常に関数またはクラスの中にあるべきであり、テーマが本当に必要とする場合にのみ制限的に使用されるべきです。グローバルな名前空間から物事を締め出すためだけにこれらをまったく使用しないことを強くお勧めします。それらはコーディング慣習としては不適切です。

Imをテーマオプションに Smof Option Framework を使用しています。これは私のテーマファイルのサンプルコードです。

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;
  }
}

グローバル$ smof_data;関数内にあるべきですが、グローバルな$ smof_dataを含まないようにするために、このタスクを実行する方法がわかりません。私が必要とするすべてのテーマファイルで。

@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' ) ) . ';}';
    }

}

任意の助けは大歓迎です。ありがとう。

1
Knott

グローバル変数に値を保持するフレームワークを扱っているのであれば、それについてできることはあまりありません。これは、静的ゲッターで変数をラップする例です。

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

データにアクセスするには

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' ) ) . ';}';
    }
}

もしあなたが自分自身のグローバルを欲しいのなら、それをクラスでラップすることもできます。

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

最初に、私はThemeforestからの返事を祝福しなければなりません、それは本当にビールに値します。グローバルは悪であり、グローバルを作成してグローバル空間をもう汚すべきではありません。 WordPressはすでにこれを巨大に混乱させています。この混乱に加えないでください。

世界的な問題を解決する最も簡単な方法の1つは、必要な場所であればどこでも使用できる関数を作成することです。これがサンプルです

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

その後、必要に応じてthis_is_my_global();を呼び出すだけで済みます。

これはとても基本的なことです。次の質問に対する@kaiserと@gmazzapの回答を読むことをお勧めします。

これは、テンプレート間で変数を受け渡すためのより複雑で信頼性の高い手段を提供するはずです。

3
Pieter Goosen