web-dev-qa-db-ja.com

すべてのWordPressページで変数を使用するための最良の方法

全体で使用したい変数がたくさんあるカスタムテーマを作成しています。

例:

$tv     = $options['tv'];
$movies = $options['movies'];
$print  = $options['print'];
//....and about 50 more.

この目的のために、私はそれらすべてをvars.phpというファイルに配置し、次にそれを含めるテーマのheader.phpに配置しました...

require_once('vars.php');

これは機能しますが、最善の方法とは思えません。 (おそらくfunctions.phpで)グローバル変数を使用することを何度も読んだことがありますが、これは良い考えではありませんか?

しかし、functions.phpでグローバル変数を使用しても問題がない場合(それらの多くでも)、これはそれを実行する正しい方法ですか?:

global $tv;
$tv     = $options['tv'];

global $movies
$movies = $options['movies'];

global $print
$print  = $options['print'];
15
User_FTW

このための最良の方法は、functions.phpまたはプラグインのメインプラグインファイルですべての変数を明示的に定義することです。 これがakismetを含む最も人気のあるプラグインの使用方法であることを確認しました。具体的にはこれを行う必要があります。

define( MYVAR_TV, $options['tv'] );
define( MYVAR_MOVIES, $options['movies'] );
define( MYVAR_PRINT, $options['print'] );

これらの後、あなたは好きな場所でそれらを使うことができます

echo MYVAR_TV;

それが役に立てば幸い。

8
shazyriver

グローバルを使用することは問題ありませんが、推奨されていません(詳細はこちらをご覧ください PHPのグローバル変数は悪い習慣と見なされますか?もしそうなら、なぜですか? )。シングルトンの実装を検討してください。

<?php
class GlobalVariable {
    /**
     * @var array
     */
    public static $option = [];
}

// You can set the variable using this way
GlobalVariable::$option['movies'] = 1;

// And get the variables using that array
print_r(GlobalVariable::$option);

これがお役に立てば幸いです。

8
Trac Nguyen

変数の配列を返すfunctions.phpで関数を作成するのはどうですか?

例:$options = get_my_custom_vars();

2
Allan Collins

カスタムストリームラッパーを実装することもできます。このようにして、file_get_contentsfile_put_contentsfreadfwriteなどの関数を使用してデータにアクセスし、保存することができます。ファイルからの読み取りと書き込み、または取得と同じです。リモートURLからの情報。

実際、PHPマニュアル、 あなたが尋ねるようなグローバル変数を使用 に例があります。しかし、完全性の順にそこから引き出して、ユースケースに適合させましょう。 in WPおよび使用例。

<?php
// variable-stream-class.php just this is pulled from the PHP manual

class VariableStream {
    var $position;
    var $varname;

    function stream_open($path, $mode, $options, &$opened_path)
    {
        $url = parse_url($path);
        $this->varname = $url["Host"];
        $this->position = 0;

        return true;
    }

    function stream_read($count)
    {
        $ret = substr($GLOBALS[$this->varname], $this->position, $count);
        $this->position += strlen($ret);
        return $ret;
    }

    function stream_write($data)
    {
        $left = substr($GLOBALS[$this->varname], 0, $this->position);
        $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
        $GLOBALS[$this->varname] = $left . $data . $right;
        $this->position += strlen($data);
        return strlen($data);
    }

    function stream_tell()
    {
        return $this->position;
    }

    function stream_eof()
    {
        return $this->position >= strlen($GLOBALS[$this->varname]);
    }

    function stream_seek($offset, $whence)
    {
        switch ($whence) {
            case SEEK_SET:
                if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
                     $this->position = $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            case SEEK_CUR:
                if ($offset >= 0) {
                     $this->position += $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            case SEEK_END:
                if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
                     $this->position = strlen($GLOBALS[$this->varname]) + $offset;
                     return true;
                } else {
                     return false;
                }
                break;

            default:
                return false;
        }
    }

    function stream_metadata($path, $option, $var) 
    {
        if($option == STREAM_META_TOUCH) {
            $url = parse_url($path);
            $varname = $url["Host"];
            if(!isset($GLOBALS[$varname])) {
                $GLOBALS[$varname] = '';
            }
            return true;
        }
        return false;
    }
}

関数を分離するプラグインがあり、デバッグのために非アクティブ化でき、アクティブなテーマを変更しても失われないと仮定しましょう。プラグインのエントリポイントに次のようなものを配置することをお勧めします。

<?php
/**
 * Plugin Name: Stream Wrapper for global variables
 * Plugin URI: https://stackoverflow.com/q/46248656/
 * Description: Utility class and functions to enable global data sharing in WordPress
 * Author: Jesús E. Franco Martínez and the PHP Documentation Group
 * Contributors: tzkmx
 * Version: 0.1
 * Author URI: https://tzkmx.wordpress.com
 */
require 'variable-stream-class.php';

stream_wrapper_register("var", "VariableStream")
    or wp_die("Failed to register protocol", null, ['back_link' => true]);

次に、テンプレートまたは他のサイトプラグインで、上記の関数を使用するか、カスタムエイリアスを使用できます。あなたの要求を拡張しましょう:

// functions.php in your theme or better, in the same plugin.php above

// Using a hook just for frontend in order to get populated
// our variables without require calls in the theme.

add_action('wp_head', 'populate_my_awesome_plugin_options');

function populate_my_awesome_plugin_options() {

// Let's say you get your data from a single get_option call
    $options = get_option( 'my_awesome_plugin_options' );

    foreach( $options as $key => $value ) {
        file_put_contents( 'var://' . $key, $value );
    }
}

function pop_get_var( $var_name ) {
    return file_get_contents( 'var://' . $var_name );
}

最後に、header.phpまたはデータを使用するテンプレートファイルでは、呼び出しは次のようになります。

<p>TV favorite show: <strong><?= pop_get_var( 'tv' ) ?></strong></p>

<p>Movies I like: <strong><?= pop_get_var( 'movies' ) ?></strong></p>

<p>Impressum: <em><?= pop_get_var( 'print' ) ?></em></p>

最初は多くの定型文のように見えるかもしれませんが、関心の分離のため、定数を使用するようなスカラー値だけに限定されるのではなく、ストリームラッパーは好きなデータストアへのアダプターになる可能性があります。メモリまたはWordPressオプションテーブルに保存されます。カスタム関数を使用すると、シングルトンクラスへのこのような長い呼び出しを記述したり、カスタムデータにアクセスしたい場所でグローバルを呼び出したりする手間が省けます。

実際、PHPマニュアルの例を読むと、ラッパーを使用してテキスト全体を格納する例が見つかります。これは、includeで呼び出すことができます。シリアル化されたデータ(たとえばjson_encode/json_decode)を使用し、ラッパーと一緒にデータベースに直接保存することを妨げるものは何もありません。データの書き込み/読み取りを行う別の例があります。 PDOを備えたデータベースですが、WordPress $wpdbオブジェクトを使用するように簡単に移植できます。

2
Jesús Franco

私は個人的に Acf Options Addon を使うのが好きです。これらを変更し、wpmlプラグインを介して翻訳可能にすることも役立ちます。

これらのオプションは、バックエンドの「オプションページ」内で、またはリンクで説明されているようにプログラムされたとおりに追加/編集できます。

関数.phpを介してアドオンを初期化した後

if( function_exists('acf_add_options_page') ) {

acf_add_options_page();

}

テンプレートでこれらを呼び出すだけです

<?php the_field('header_title', 'option'); ?>
  • これらの例は、Acfオプションページのドキュメントから抜粋したものです。
  • これを機能させるには、 https://www.advancedcustomfields.com/ をインストールする必要があることに注意してください。
2
cptnk

私はあなたがグローバル変数を望んでいると仮定しています、そこでそれはあなたのすべての変数で配列を作ります。それを使用するには:

$GLOBALS['your-varriable']

出典: PHPドキュメント

2
HoogleyBoogley