it-swarm.com.de

Zusammenführen PHP Laden Sie das Skript in `functions.php` herunter

Ich verwende eine große Mixtape-Download-Site auf WordPress. Ich entwickle gerade ein neues Thema und möchte so viel Site-Funktionalität wie möglich in den functions.php des Themas aufnehmen.

Zum Servieren der Downloads habe ich mehrere PHP Skripte. Ein Download wird von einem Besucher durch Klicken auf die URL (Beispiel) aufgerufen: http://www.tjoonz.com/house.php?id=1234&file=post-slug.
Das Skript bereinigt die Parameter und stellt die MP3-Dateien aus einem privaten Serververzeichnis bereit. Mein Hauptanliegen ist, dass diese Skripte die Details der Datenbankverbindung enthalten, wofür ich viel lieber $wpdb verwende.

Aktuelle Skripte (als Referenz)

Ich entschuldige mich, wenn dies etwas übertrieben ist, aber es kann später nützlich sein. Sie können dieses Bit wahrscheinlich vorerst überspringen, wenn Sie nur meine Frage lesen.

PHP

<?php // Tjoonz.com download script v1.2

// test arguments
if(!isset($_REQUEST['id']) || empty($_REQUEST['id']) || !isset($_REQUEST['file']) || empty($_REQUEST['file'])) 
{
    // invalid argument(s), abort script
    header("HTTP/1.0 400 Bad Request");
    die();
}

// set variables
$current_time = time();
$user_ip = $_SERVER['REMOTE_ADDR'];
$post_id = $_GET['id'];
$file_requested = $_GET['file'];
$file_name = strip_tags($file_requested);
$file_path = '/home/tjoonz/audio/house/';
$locked = false;

// test if cookie 'downloadsAllowed' is set
// this prevents hotlinking on other domains for users who haven't visited Tjoonz.com yet
if ($_COOKIE["downloadsAllowed"] == "tj00nz")
{   
    $file_full = $file_path.$file_name;
    if (file_exists($file_full)) // test if requested mixtape exists
    {
        // establish connection to database for Play Counter test
        $user="#######";
        $password="#######";
        $database="#######";
        $Host="#######";
        mysql_connect($Host,$user,$password);
        mysql_select_db($database) or die(mysql_error());

        // set timerange to 2 hours ago (right now minus 7200 seconds)
        $timerange = $current_time - 7200;
        // get all records from 'playcount_lock' table
        $locks = mysql_query("SELECT * FROM playcount_lock WHERE request_time > $timerange") or die(mysql_error()); 

        // test if current IP address has already accessed this mixtape in the last 2 hours
        while ($lock = mysql_fetch_object($locks))
        {
            // set variables with data from record
            $lock_ip = $lock->ip_address;
            $lock_id = $lock->post_id;
            $lock_time = $lock->request_time;

            // compare record data with current user data
            if($lock_ip == $user_ip && $lock_id == $post_id && ($lock_time + 7200) >= $current_time)
            {
                // match found, break out of while loop and continue with script
                $locked = true;
                break;
            }
        }

        if (!$locked) // if playcounter is not locked, update the database
        { 
            // add a lock entry for the next two hours
            mysql_query("INSERT INTO `playcount_lock` (`request_time`, `post_id`, `ip_address`) VALUES ('$current_time', '$post_id', '$user_ip')") or die(mysql_error());

            // update the play counter for this mixtape
            $post_meta = mysql_query("SELECT meta_value FROM `wp_postmeta` WHERE `meta_key` = '_played' AND `post_id` = ".$post_id);
            $count = @mysql_result($post_meta, 0);

            if($count == FALSE)
            {
                // if no plays are present, insert the metadata into table
                mysql_query("INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (".$post_id.",'_played',1)");
            }
            else
            {
                // otherwise increase the existing number of plays by 1
                $newCount = mysql_result($post_meta, 0) + 1;
                mysql_query("UPDATE `wp_postmeta` SET meta_value = ".$newCount." WHERE `meta_key` = '_played' AND `post_id` = ".$post_id);
            }
        }

        // we're done with the database, kill the connection
        mysql_close();

        // finally, send the file
        header("X-SENDFILE: ".$file_full);
        header("Content-Type: audio/mpeg");
        header("Content-Disposition: attachment; filename=".basename($file_full));
        header("Content-Length: ".filesize($file_full));
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Transfer-Encoding: binary");
    }
    else // couldn't find that mixtape
    {
        header('HTTP/1.0 404 Not Found');
    }

}
else // cookie 'downloadsAllowed' not set, redirecting user to mixtape page
{
    $file_redirection = substr($file_name,0, -4);
    header("Location: http://www.tjoonz.com/house/" . $file_redirection . "/");
}

?>

JS

// when playnow is clicked, add to myPlaylist and immediately start playing the mixtape
$("body").on("click", ".jplayer-playnow", function (e) {
    e.preventDefault();

    // add to Play Queue and play it immediately
    $.jPlayer.timeFormat.showHour = true;
    $.jPlayer.timeFormat.sepHour = ":";
    $.jPlayer.timeFormat.sepMin = ":";
    $.jPlayer.timeFormat.sepSec = "";
    myPlaylist.add({
        title: $(".single-title-mixtape").text(),
        artist: $(".single-title-artist").text(),
        genre: $(".jplayer-playnow span").attr("class"),
        mp3: $(this).attr("href"),                       // <--- This is where my problem comes up for my new theme, keep reading
        poster: $(".wp-post-image").attr("src")
    }, true); // true value here makes the newly added track play immediately
});

Intentionen

Ich verwende das aktuelle Skript in zweifacher Hinsicht: Wenn ein Benutzer auf die Schaltfläche PLAY klickt, verhindert jQuery, dass der Link aufgerufen wird, und verwendet die URL, um einen Musik-Player anzuweisen, stattdessen die Datei abzurufen. Wenn ein Benutzer auf die Schaltfläche DOWNLOADS klickt, folgt der Browser einfach und ein direkter Download wird initiiert. Beide Schaltflächen verwenden dieselben Skripte und dieselben URLs.

In meinem neuen Skript möchte ich house.php, electro.php, dubstep.php, drum-and-bass.php und techno.php mit einem einzelnen Skript kombinieren, das einen genre-Parameter verwendet. Abhängig davon, wie es hier weitergeht, füge ich einen Parameter hinzu, um die action (herunterladen oder abspielen) anzugeben.

Ich beabsichtige, das Skript vollständig in functions.php einzubetten. Auf einer Mixtape-Seite wären zwei Links:

<!--Play-->
<a href="?id=<?php echo $post->ID; ?>&file=<?php tjnz_slug(); ?>&genre=<?php echo $category[0]->category_nicename; ?>&action=play">Play</a>
<!--Download-->
<a href="?id=<?php echo $post->ID; ?>&file=<?php tjnz_slug(); ?>&genre=<?php echo $category[0]->category_nicename; ?>&action=download">Download</a>

Das Problem

In meinem alten Skript habe ich einfach Wiedergabelinks (nach Klassennamen auf dem Anker) abgefangen und die Standardbrowseraktion verhindert. Dann habe ich meine Sachen gemacht. Ich konnte dies tun, weil ich auf eine "echte" Datei verweisen konnte (z. B. house.php).

Wenn ich den Code in functions.php stecken würde, wie kann ich meinem Musikplayer mitteilen, wo sich die Audiodatei befindet? Die Audiodatei muss nicht unbedingt eine MP3-Datei sein, wie aus meinem aktuellen Code hervorgeht: Ich weise jPlayer an, dass sich die Audiodatei beispielsweise in house.php befindet.

Wie kann ich jPlayer mitteilen, dass die Datei jetzt aus dem mysteriösen functions.php stammt? Verlinke ich direkt zu theme dir/functions.php? Klingt nicht nach einer guten Idee, aber das ist nur mein Bauchgefühl.

Wie ich bereits sagte, der Hauptgrund, warum ich möchte, dass sich das Skript in functions.php befindet, ist, dass ich die Möglichkeiten von $wpdb nutzen kann. Wenn noch eine separate PHP -Datei übrig ist, würde ich diese Antwort immer noch akzeptieren (vorausgesetzt, Sie haben diese Theorie gesichert).

1
Marc Dingena

Sie rufen keine Inhalte direkt aus der functions.php-Datei per URL-Referenz auf.

Der functions.php wird mit dem WordPress-Theme geladen und stellt Ihnen Funktionen aus den Theme-Template-Dateien zur Verfügung.

Der größte Teil Ihres Codes kann direkt in den functions.php portiert werden, aber Sie müssen eine Art Schnittstelle um ihn wickeln, die in einer Seitenvorlage aufgerufen werden kann.

Wenn ich das täte, würde ich wahrscheinlich etwas PHP Code in die index.php des Themas einfügen, ganz oben, um einen Blick darauf zu werfen, was im $_REQUEST-Objekt enthalten ist, wie Sie es zu Beginn Ihres Themas getan haben PHP Code.

Anstatt dann das bereits vorhandene PHP auszuführen, rufen Sie Funktionen in Ihrer functions.php -Datei auf, die sich mit den tatsächlichen DB-Verbindungen befassen und die Datei bedienen.

Wie Sie bereits erwähnt haben, müssen Sie die globale Variable $wpdb verwenden, um die Tabellen zu lesen, und die gute Nachricht ist, dass Sie sich nicht bei der Datenbank authentifizieren müssen, da Sie in der WordPress-Sitzung arbeiten, also keine UN/PW-Informationen .

Ihr JS wird am besten in einer separaten Datei in Ihrem Design bereitgestellt und mit wp_enqueue_script ordnungsgemäß in WordPress geladen.

2
user28206