PHP-Download-Skript in `functions.php` zusammenführen

Ich betreibe eine große Mixtape-Download-Site auf WordPress. Ich entwickle gerade ein neues Theme und möchte so viele Seitenfunktionen in die functions.php des Themes functions.php .

Um die Downloads zu bedienen, habe ich mehrere PHP-Skripte. Ein Download wird von einem Besucher aufgerufen, indem er auf URL klickt (Beispiel): http://www.tjoonz.com/house.php?id=1234&file=post-slug .
Das Skript bereinigt die Parameter und bedient die MP3 Dateien aus einem privaten Serververzeichnis. Mein Hauptanliegen ist, dass diese Skripte die databaseverbindungsdetails enthalten, für die ich lieber $wpdb .

Aktuelle Skripte (als Referenz)

Ich entschuldige mich, wenn dies ein wenig übertrieben ist, aber es könnte später nützlich sein. Sie können dieses Bit für jetzt wahrscheinlich überspringen, wenn Sie gerade meine Frage lesen.

PHP

  $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 benutze das aktuelle Skript zweifach: Wenn ein Benutzer auf die Schaltfläche PLAY klickt, verhindert jQuery, dass die Verknüpfung zu navigiert wird, und übernimmt die URL, um einen Musikplayer anzuweisen, stattdessen die Datei zu erhalten. Wenn ein Benutzer auf die Schaltfläche DOWNLOADS klickt, folgt der Browser einfach und ein direkter Download wird gestartet. Beide Schaltflächen verwenden dieselben Skripts 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 einzigen Skript techno.php , das einen genre Parameter enthält. Abhängig davon, wie die Dinge von hier ausgehen, füge ich einen Parameter hinzu, um die action zu spezifizieren (herunterladen oder abspielen).

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

  <a href="https://wordpress.stackexchange.com/?id=ID; ?>&file=&genre=category_nicename; ?>&action=play">Play  <a href="https://wordpress.stackexchange.com/?id=ID; ?>&file=&genre=category_nicename; ?>&action=download">Download 

Das Problem

In meinem alten Skript habe ich einfach Links (nach classnnamen auf dem Anker) abgefangen und die Standard-Browseraktion verhindert, dann mache ich meine Sachen. Ich konnte das machen, weil ich auf eine ‘echte’ Datei zeigen konnte (zB house.php ).

Wenn ich den Code in functions.php stecken würde, wie kann ich meinen Musikplayer anweisen, wo sich die Audiodatei befindet? Die Audiodatei muss nicht zwingend eine MP3 Datei sein, wie mein aktueller Code zeigt: Ich weise jPlayer an, dass sich die Audiodatei beispielsweise in der house.php befindet.

Wie kann ich jPlayer sagen, dass die Datei jetzt von der mysteriösen functions.php ? Verbinde ich direkt mit dem theme dir/functions.php ? Klingt nicht nach einer guten Idee, aber das ist nur mein Bauchgefühl.

Wie ich schon sagte, der Hauptgrund, warum ich das Skript in der functions.php möchte, ist, dass ich die Macht von $wpdb . Wenn eine separate PHP-Datei immer noch der richtige Weg ist, akzeptiere ich diese Antwort immer noch (vorausgesetzt, du hast diese Theorie bestätigt).

Solutions Collecting From Web of "PHP-Download-Skript in `functions.php` zusammenführen"

Sie rufen Sachen nicht direkt aus der Datei functions.php nach URL-Referenz auf.

Die functions.php ist mit dem WordPress-Theme geladen und stellt functionen aus den Theme-Template-Dateien zur Verfügung.

Der Großteil Ihres Codes kann direkt in die functions.php portiert werden, aber Sie müssen eine Art Schnittstelle umschließen, die innerhalb einer Seitenvorlage aufgerufen werden kann.

Wenn ich das tun würde, würde ich wahrscheinlich etwas PHP-Code in die index.php des Themes $_REQUEST , rechts oben, um zu sehen, was sich im $_REQUEST Objekt befindet, wie Sie es am Anfang Ihres PHP-Codes tun.

Anstatt die bereits vorhandene PHP-Datei auszuführen, würden Sie dann functionen aufrufen, die sich in Ihrer Datei functions.php befinden, die sich mit den tatsächlichen DB-Verbindungen befassen und die Datei bereitstellen.

Wie Sie bereits erwähnt haben, müssen Sie die globale Variable $wpdb , um die Tabellen zu lesen, und die gute Nachricht ist, dass Sie sich nicht mit der DB authentifizieren müssen, weil Sie innerhalb der WordPress-Sitzung arbeiten, also kein UN / PW Info.

Ihr JS wird am besten in einer separaten Datei innerhalb Ihres Themas wp_enqueue_script und mit wp_enqueue_script korrekt in WordPress wp_enqueue_script .