Liefern einer Datei anstelle der WordPress-Seite

Ich versuche, eine Seite zu erstellen, auf der ein Benutzer eine ID eines Anhangs bereitstellt, und die Site wird die Header festlegen und diese Datei anstelle einer 404-Seite bereitstellen. So / download / 1754 würde den Anhang mit dieser ID suchen und je nach Dateityp zum Anzeigen / Herunterladen ausgeben.

Ich kann mir einfach keine WordPress-freundliche Möglichkeit vorstellen, dies innerhalb eines Plugins zu tun. Ich dachte über die Verwendung von add_rewrite_rule nach, konnte aber keinen guten Weg finden, auch $ _SERVER [‘REQUEST_URI’] zu überprüfen, um den Inhalt vor HTML zu liefern, aber dann musste ich die 404-Rendering-Seite anhalten und ich war es nicht sicher von einem WordPress-freundlichen Weg, dies zu tun.

Meine derzeitige Idee war, dass mein Plugin eine Download-Seite erstellen, eine Vorlage zuweisen und diese Vorlage die Logik anstelle meiner Plugin-class ausführen lassen sollte. Während ich dies zuvor für eine andere Situation verwendet habe, war es sehr unordentlich, da ich viel Code schreiben musste, um Benutzer dazu zu zwingen, die Datei zu aktualisieren oder zu bearbeiten und sie bei Aktivierung von activation.de neu zu erstellen / löschen. Im Idealfall möchte ich das vermeiden.

Solutions Collecting From Web of "Liefern einer Datei anstelle der WordPress-Seite"

Sie sind auf dem richtigen Weg mit einer Rewrite-Regel. Wenn Sie nur eine Datei bereitstellen, können Sie eine frühe Aktion aktivieren, prüfen, ob ein Download angefordert wurde, dann die Datei ausgeben und beenden, bevor WordPress überhaupt die database abfragt und entscheidet, ob die Anfrage ein 404 ist.

 // add the download ID query var which we'll set in the rewrite rule function wpd_query_var( $query_vars ){ $query_vars[] = 'download_id'; return $query_vars; } add_filter( 'query_vars', 'wpd_query_var' ); // add rewrite rule function wpd_rewrite(){ add_rewrite_rule( 'download/([0-9]+)/?$', 'index.php?download_id=$matches[1]', 'top' ); } add_action( 'init', 'wpd_rewrite' ); // check for download_id and output the file function wpd_request( $wp ){ if( array_key_exists( 'download_id', $wp->query_vars ) ) { // output your headers and file here // ID is in $wp->query_vars['download_id'] // then exit to halt any further execution exit; } } add_action( 'parse_query', 'wpd_request' ); 

Sie können das folgende Beispiel für Bildanhänge ausprobieren:

 add_action( 'init', function() { add_rewrite_endpoint( 'download', EP_ROOT ); add_action( 'template_redirect', function() { if ( $pid = get_query_var( 'download' ) ) { $found = false; if( $file = wp_get_attachment_image_src( absint( $pid ), 'full' ) ) { $found = true; header( "Content-Disposition: attachment; filename=" . basename( $file[0] ) ); readfile( $file[0] ); exit(); } if( ! $found ) wp_die( __( 'Image file not found!' ) ); } } ); } ); 

wo Sie die Header möglicherweise an Ihre Bedürfnisse anpassen müssen.

Generiere deine Rewrite-Regeln neu und dann solltest du in der Lage sein, die Image-Anhänge herunterzuladen von:

 http://example.tld/download/123/ 

Es gibt viel bessere Skripte, verglichen mit dieser einfachen Demo, aber es scheint bei meiner Installation zu funktionieren. Schau dir zum Beispiel dieses Blog an , es scheint einige interessante Ideen zu haben, wie man mit großen Dateien umgehen kann.

Hoffentlich können Sie es an Ihre Bedürfnisse anpassen.