Erstellen von Download-Links basierend auf benutzerdefinierten Feldern mit Rewrite-API

Für mich ist das ziemlich schwierig, aber ich denke, dass dies leicht von einem Experten erledigt werden könnte. 🙂

Nehmen wir an, ich habe einen Post, der eine benutzerdefinierte Post-Typ- resources , mit den folgenden Daten:

  • Postschnecke : Strand
  • Benutzerdefinierte Felder :
    • dl1file : Bikini
    • dl1link : assets / file1.zip
    • dl1count : 56
    • dl2file : Strandball
    • dl2link : assets / file2.zip
    • dl2count : 31

Der obige Beitrag enthält mehr als eine Datei zum Herunterladen, und alle werden in benutzerdefinierten Feldern als dlNfile gespeichert, wobei N Zahlen sind (zB: dl1file ). Außerdem hat jede dieser Dateien zwei weitere benutzerdefinierte Felder, dlNlink (z. B. dl1link ), die in der URL verwendet wird, und dlNcount (z. B. dl1count ) speichert die Download-Zählnummer.

Jetzt, mit Rewrite API, muss ich site.com/?resource=beach&file=bikini (oder wenn es einfacher ist, site.com/resources/beach/?file=bikini ) in site.com/download/beach/bikini .

Wenn einer der Links angeklickt wird, und da ich nur die resource , die Post-Slug, und den Wert eines der dlNfile , muss WordPress nun wissen, welchen Post die richtige dlNfile abrufen und identifizieren soll Fall ist dl1file . Dann wird es wissen, dass der echte Dateiname in dl1link gespeichert dl1link und dann geht es zum Download ( site.com/assets/file1.zip ) und inkrementiert dl1count um 1.


Bearbeiten : Ich habe versucht, Jesper Tutorial zuvor, aber ich möchte nicht einen neuen Beitrag nur zum Speichern einer Download-Datei Informationen erstellen.

Ich stellte auch eine andere URL-Idee zur Verfügung, die die URL-Parameter- resource nicht speichern muss, die die Post-Slug ist.

Solutions Collecting From Web of "Erstellen von Download-Links basierend auf benutzerdefinierten Feldern mit Rewrite-API"

Der erste Schritt bei dieser Arbeit besteht darin, Ihre benutzerdefinierte Abfrage var für die Datei über den query_vars Filter zu registrieren. Ich habe es wpa82328_file , aber Sie können dies zu etwas aussagekräftiger für Sie ändern. file ist ein wenig generisch, also solltest du sie mit etwas versehen, das eindeutig ist:

 function wpa82328_query_vars( $query_vars ){ $query_vars[] = 'wpa82328_file'; return $query_vars; } add_filter( 'query_vars', 'wpa82328_query_vars' ); 

Als nächstes wird die Rewrite-Regel, die eingehende Anfragen in /download/resource/file/ von der hübschen URL in query vars konvertiert:

 function wpa82328_rewrite_rule(){ add_rewrite_rule( '^download/([^/]+)/([^/]+)/?$', 'index.php?resource=$matches[1]&wpa82328_file=$matches[2]', 'top' ); } add_action( 'init', 'wpa82328_rewrite_rule' ); 

Dies wird alles auf die Hauptindex.php-Datei verweisen, wobei die Ressourcen- und Dateinamenabfragevariablen gesetzt sind.

Als nächstes müssen wir diese Anfragen frühzeitig erfassen, bevor die Hauptabfrage ausgeführt und die Header gesendet werden. Wenn wir dies später versuchen, werden Header bereits gesendet und Downloads funktionieren nicht.

Ich habe die parse_request Aktion parse_request , bei der ein ref-Array von query vars als Argument an die hooked-function übergeben wird. Wir können dann leicht auf das Vorhandensein der wpa82328_file Abfrage var prüfen, die uns sagt, dass ein Download angefordert wird. Lesen Sie die Kommentare im Code, um zu verstehen, was in jedem Schritt geschieht:

 function wpa82328_parse_request( &$wp ){ // if the wpa82328_file query var is set if ( array_key_exists( 'wpa82328_file', $wp->query_vars ) ){ // query for the requested resource $args = array( 'name' => $wp->query_vars['resource'], 'post_type' => 'resource' ); $resource = new WP_Query( $args ); // get all of the custom fields for this resource $custom_fields = get_post_custom( $resource->post->ID ); // check each custom field for a value that matches the file query var foreach( $custom_fields as $key => $value ): // if a custom field value matches, we have the correct key if( in_array( $wp->query_vars['wpa82328_file'], $value ) ){ echo 'file key is: ' . $key; // increment count // set proper headers // initiate file download exit(); } endforeach; } return; } add_action( 'parse_request', 'wpa82328_parse_request' ); 

Der letzte Teil, den Sie aussortieren müssen, ist das Extrahieren der Nummer aus dem Schlüssel, damit Sie die richtigen Zähl- und Asset-Schlüssel erhalten. Ich würde es persönlich ändern, um die Nummer zuletzt zu haben, was es einfacher macht, einfach einen substr auf dem Schlüssel zu machen, um die Nummer zu bekommen. Oder besser, ich würde sie alle als Array von Arrays unter einem einzigen Schlüssel speichern. Wenn Sie also den Index gefunden haben, der den angeforderten Namen enthält, müssen Sie nur zum nächsten Index gehen, um die Anzahl zu finden, und zum nächsten, um den zu finden Inventar-URL