2

以前に遭遇したことのない wordpress サイトで問題が発生しています。いくつかの簡単な詳細を提供させてください...

背景: 私が取り組んでいるサイトは、大学のラジオ局用です。ステーションは、さまざまな学生ショーに分割される「ショータイム」の 9 つの 2 時間ブロックでセットアップされます。これらの時間ブロックは、2 時間間隔で午前 8 時に開始し、午前 2 時に終了します。つまり、午前 8 時から午前 10 時、正午の午前 10 時から午後 12 時などです。「再生中」の番組と、「次の再生」の直後の番組を表示する必要があります。

そうは言っても...私は以下のコードを書いており、テストサイトで動作することが確認されています...そのサイトはhttp://khill.mhostiuckproductions.com/siteNowplaying/ です.

これをワードプレスに切り替えると、次のエラーが表示されます。

昨日チャットで紳士の助けを借りて私が決定した/知っていること:

の配列が空$showBlocksであるため、上記のエラーが発生しています。これは、var ダンプがNULLを出力する wordpress サイトでその配列をforeach実行することでわかります。これは、私の変数がグローバルであることと関係があります (グローバル変数は、私が理解していることから厄介になる可能性があります)。var_dump

その紳士は可能な解決策を提供してくれましたが、その日の仕事をやめなければならない前に、私は完全に機能させることができませんでした。その提案された解決策について以下で説明します...


コード:

今、私はこのコードがひどいものであり、クラスを使用する必要があり、最終的にはデータベースを使用する必要があることに気付きました。PHP や SQL の経験があまりなく、締め切りが迫っているため、私のコードは現在このようになっています。先に進んでサイトの残りの部分を完成できるように、これをノックアウトして機能させる必要があります。新しいテーマがローンチされたら、バックグラウンドでこれをさらに開発する予定です。最終的には、プラグイン/ウィジェットとして wordpress CMS に結び付けられます。

そうは言っても...私がやっていることは非常にブルートフォースであることを認識しており、ブルートフォースソリューションで問題ありません。上で述べたように、私のコードはスタンドアロンのテスト サイトで完全に動作します。コードが壊れるのは、wordpress に移動したときだけです。

1 日に必要なものだけを提供するようにコードを単純化しました (曜日ごとに重複するものがたくさんあります。さらに下に進むとわかります)。

ファイルの先頭に次の変数があります...

$day = date(D);  // Textual representation of day in the format of "Mon, Tue, Wed" etc.

date_default_timezone_set('America/New_York'); // Set the default time zone (EST)

私は次の配列を持っています...最初のものは開始時間と終了時間に従って時間の「ブロック」を確立し、2番目のものは私の「出力」を格納する変数をもたらします。これらの出力は、ここに示すすべてのコードを含むファイルの上に含まれる別のファイルにあります。2 番目の配列は曜日ごとに指定され、それに応じて変数名が変更されます。

// $showBlocks Array
$showBlocks = array ( // Define available blocks of show time | starts at 8AM ends at 2AM with 2 hour increments
    'a' => array ('00:00:01', '02:00:00'),  // MIDNIGHT TO 2AM
    'b' => array ('02:00:00', '08:00:00'),  // OFF AIR TIME
    'c' => array ('08:00:00', '10:00:00'),
    'd' => array ('10:00:00', '12:00:00'),
    'e' => array ('12:00:00', '14:00:00'),  // NOON to 2PM
    'f' => array ('14:00:00', '16:00:00'),
    'g' => array ('16:00:00', '18:00:00'),
    'h' => array ('18:00:00', '20:00:00'),
    'i' => array ('20:00:00', '22:00:00'),
    'j' => array ('22:00:00', '23:59:59'),
);

$mondayShows = array ( 
    'a' => $sunday12a_2a, // MIDNIGHT TO 2AM
    'b' => $offAirTime, // OFF AIR TIME
    'c' => $monday8a_10a,
    'd' => $monday10a_12,
    'e' => $mondayy12_2, // NOON to 2PM
    'f' => $monday2_4,
    'g' => $monday4_6,
    'h' => $monday6_8,
    'i' => $monday8_10,
    'j' => $monday10_12a,
);

最初の関数...これは、今日が何日かをチェックするだけで、echo はその日に適切な関数です。これは、次に示すコードの一部です。nowPlaying()出力を表示したいサイトで関数をエコーし​​ます。

function nowPlaying() {
    global $day;
    if ($day == "Sun") { //IF DAY IS TRUE THEN PERFORM AN ACTION
        echo sundayShow();
    } else if ($day == "Mon") {
        echo mondayShow();
    } else if ($day == "Tue") {
        echo tuesdayShow();
    } else if ($day == "Wed") {
        echo wednesdayShow();
    } else if ($day == "Thu") {
        echo thursdayShow();
    } else if ($day == "Fri") {
        echo fridayShow();
    } else if ($day == "Sat") {
        echo saturdayShow();
    }
}

簡単にするために、上記の関数内に表示される関数の 1 つだけを示します。今日は月曜日なので、Monday を使用します。

この関数は、上記の 2 つの配列を入力として使用し、関数の配列$mondayShows変数を に変更します。(基本的に、配列入力の変数名が異なるまったく同じコード) ここでの foreach は、エラー コードが問題があることを示している行です。繰り返しますが、php チャットの誰かが私を案内してくれたように、このコードをワードプレスに入れると、突然配列が空になるからです。$tuesdayShowstuesdayShow()

function mondayShow() {
    global $mondayShows, $showBlocks; // GLOBALIZE THESE VARIABLES

    foreach ($showBlocks as $name => $range) {
        if (time() > strtotime($range[0]) && strtotime($range[1]) > time()) {  // checks if time() is between defined ranges from $showBlocks array
            echo($mondayShows[$name]); 
        }
    }
}

先ほど、「Playing Next」とは何かを表示することについても言及しました。これは、上記のすべてのコードを新しい名前で複製することによって処理されます。たとえば、上記の関数の同等のコードの名前は になりmondayNextShow()ます。time()コードに実際の次の番組を表示させるには、 so...に 7200 (2 時間の秒数) を追加しますtime + 7200。この追加は、上記のコードの if ステートメント内にあるため、次のようになります...

if (time() + 7200 > strtotime($range[0]) && strtotime($range[1]) > time() + 7200) {

チャットで提案されたものの、作業を開始できなかったもの:

チャットでは、グローバル変数を取り除き、別のファイルを介して配列を関数に直接含めることが提案されました...上記の$showBlocks配列を別のファイル「now-playing-array.php」に移動してこれを試しました例えば。配列コードは上記から に変更されたため、次returnarrayようになります。

return array ( 
    'a' => array ('00:00:01', '02:00:00'),  // 12AM MIDNIGHT TO 2AM
    'b' => array ('02:00:00', '08:00:00'),  // OFF AIR TIME
    'c' => array ('08:00:00', '10:00:00'),
    ....................
);

__DIR__次に、上記の関数のグローバル変数から $showBlocks を削除し、マジック定数を使用してそのファイルを関数に含めます。

上記の関数は次のようになります。

function mondayShow() {
    global $mondayShows; // GLOBALIZE THESE VARIABLES

    $showBlocks = include __DIR__."/now-playing-arrays.php";

    foreach ($showBlocks as $name => $range) {
        if (time() > strtotime($range[0]) && strtotime($range[1]) > time()) {  // checks if time() is between defined ranges from $showBlocks array
            echo($mondayShows[$name]); 
        }
    }
}

A現在生産中var_dump:$showBlocksbool(false)


さて、質問は...

このコードは非常に力ずくであることに注意してください。このプロジェクトを使用して、PHP を拡張してクラスやデータベースなどを使用する予定ですが、今は時間がありません。私は探していません。あなたのコードはひどいです。最初からやり直して、正しい方法で答えを出す必要があります...私はすでにそれを知っています。

まず、このチャットの紳士が私を連れて行こうとしていたルートがわかれば、それが最善のルートでしょうか?

それが最良のルートである場合、どうすればそれを終わらせることができますか? 私が収集したものから、bool(false) のことは、ファイルが見つからないことを意味しますか? ファイルはすべて同じフォルダーにあります。

4

1 に答える 1

2

戻り配列を関数に入れ、関数を呼び出して関数内から変数に割り当てることができますmondayShow()

function showBlocks(){
    return array (
        'a' => array ('00:00:01', '02:00:00'),  // MIDNIGHT TO 2AM
        'b' => array ('02:00:00', '08:00:00'),  // OFF AIR TIME
        'c' => array ('08:00:00', '10:00:00'),
        'd' => array ('10:00:00', '12:00:00'),
        'e' => array ('12:00:00', '14:00:00'),  // NOON to 2PM
        'f' => array ('14:00:00', '16:00:00'),
        'g' => array ('16:00:00', '18:00:00'),
        'h' => array ('18:00:00', '20:00:00'),
        'i' => array ('20:00:00', '22:00:00'),
        'j' => array ('22:00:00', '23:59:59'),
    );
}

function mondayShows(){
    return array ( 
        'a' => "a", // MIDNIGHT TO 2AM
        'b' => "b", // OFF AIR TIME
        'c' => "c",
        'd' => "d",
        'e' => "e", // NOON to 2PM
        'f' => "f",
        'g' => "g",
        'h' => "h",
        'i' => "i",
        'j' => "j",
    );
}

function mondayShow() {

    $showBlocks = showBlocks();
    $mondayShows = mondayShows();

    foreach ($showBlocks as $name => $range) {
        if (time() > strtotime($range[0]) && strtotime($range[1]) > time()) {
            echo($mondayShows[$name]); 
        }
    }
}
mondayShow();

このように、明示的にグローバル化する必要はなく、余分なファイルがあることを心配する必要もありません。各ショー リスト配列に対して単純に関数を作成し、それを返します。

ちょっとしたこと: 上記のコードでは、$mondayShows配列の値を定義済みのもの (文字のみ) に変更したので、実際にそれらを何かに割り当てていることを確認してください。

于 2013-07-22T23:45:37.673 に答える