web-dev-qa-db-de.com

Wie kann ich eine Textdatei unter einer benutzerdefinierten URL bereitstellen?

Ich habe eine WordPress-Site im Stammverzeichnis des Webservers installiert: / Ich möchte eine Textdatei von hier aus bereitstellen: /.hiddendir/secondlevel/textfile

Ich habe diese Datei und dieses Verzeichnis auf dem Server unter ../wwwroot/.hiddendir/secondlevel/textfile erstellt.

Wenn ich versuche zuzugreifen, bekomme ich einen 404 von WordPress.

Der Grund ist, eine erforderliche "Verifizierungs" -Datei für einen Dienst hinzuzufügen, den ich verwenden möchte. Es wird eine URL angezeigt, um sicherzustellen, dass Sie Eigentümer der Website sind (Yahoo und Google tun dies für die verschiedenen Dienste).

Ich habe versucht, die Textdatei zur Mediengalerie hinzuzufügen, aber die URL kann nicht angepasst werden. Ich suche ein Plugin, kann es aber nicht finden.

Sie können add_rewrite_rule verwenden, um einen neuen Endpunkt wiehttp://example.com/api/files/xyzzu erstellen, der die Anforderung verarbeitet und den Inhalt von Ihrem Server wiedergibt. Auf diese Weise können Sie den Ursprung der Datei maskieren und trotzdem auf deren Inhalt zugreifen.

add_rewrite_rule erfordert Sie flush_rewrite_rules aber Sie müssen das nur einmal jedes Mal tun, wenn Sie Änderungen an Ihren Umschreibungen vornehmen. Lassen Sie also im Wesentlichen diese eine Zeile zum Testen ein, aber nehmen Sie sie während der Produktion heraus.

Sobald Sie festgestellt haben, dass die URL eine Datei anfordert und welche Datei Sie präsentieren möchten, führen Sie eine schnelle is_readable Überprüfung durch, um sicherzustellen, dass der file exists und Sie Zugriff auf den Inhalt haben.

An diesem Punkt können Sie einige Header schreiben, um die Datei zu beschreiben, den Inhalt zu lesen und mit readfile in den Ausgabepuffer zu schreiben.

Sie können dies in Ihremfunctions.phpoder in einem Plugin ablegen, um den Zugriff unabhängig vom Thema zuzulassen.

Beschreibungen sind in den Codekommentaren.

<?php

if ( ! class_exists( 'FileEndpoint' ) ):

    class FileEndpoint {
        const ENDPOINT_QUERY_NAME  = 'api/files';
        const ENDPOINT_QUERY_PARAM = '__api_files';

        // WordPress hooks

        public function init() {
            add_filter( 'query_vars', array ( $this, 'add_query_vars' ), 0 );
            add_action( 'parse_request', array ( $this, 'sniff_requests' ), 0 );
            add_action( 'init', array ( $this, 'add_endpoint' ), 0 );
        }

        // Add public query vars

        public function add_query_vars( $vars ) {

            // add all the things we know we'll use

            $vars[] = static::ENDPOINT_QUERY_PARAM;
            $vars[] = 'file';

            return $vars;
        }

        // Add API Endpoint

        public function add_endpoint() {
            add_rewrite_rule( '^' . static::ENDPOINT_QUERY_NAME . '/([^/]*)/?', 'index.php?' . static::ENDPOINT_QUERY_PARAM . '=1&file=$matches[1]', 'top' );

            //////////////////////////////////
            flush_rewrite_rules( false ); //// <---------- REMOVE THIS WHEN DONE
            //////////////////////////////////
        }

        // Sniff Requests

        public function sniff_requests( $wp_query ) {
            global $wp;

            if ( isset(
                $wp->query_vars[ static::ENDPOINT_QUERY_PARAM ],
                $wp->query_vars[ 'file' ] ) ) {
                $this->handle_file_request(); // handle it
            }
        }

        // Handle Requests

        protected function handle_file_request() {
            global $wp;

            $file     = $wp->query_vars[ 'file' ];
            $filepath = '';

            switch ( $file ) {

                // example.com/api/files/xyz
                case 'xyz':
                    $filepath = __DIR__ . '/filename.txt';
                    break;
            }

            if ( ! empty( $filepath ) ) {

                // Make sure this is an accessible file
                // If we can't read it throw an Error
                if ( ! is_readable( $filepath ) ) {

                    $err = new WP_Error( "Forbidden", "Access is not allowed for this request.", 403 );
                    wp_die( $err->get_error_message(), $err->get_error_code() );
                }

                // We can read it, so let's render it
                $this->serve_file( $filepath );
            }

            // Nothing happened, just give some feedback
            $err = new WP_Error( "Bad Request", "Invalid Request.", 400 );
            wp_die( $err->get_error_message(), $err->get_error_code() );
        }

        // Output the file

        protected function serve_file( $filepath, $force_download = false ) {

            if ( ! empty ( $contents ) ) {

                // Write some headers

                header( "Cache-control: private" );
                if ( $force_download ) {

                    // Allow a forced download
                    header( "Content-type: application/force-download" );
                    header( "Content-disposition: attachment; filename=\"filename.txt\"" );
                }
                header( "Content-transfer-encoding: binary\n" );
                header( "Content-Length: " . filesize( $filepath ) );

                // render the contents of the file
                readfile( $filepath );

                // kill the request. Nothing else to do now.
                exit;
            }

            // nothing happened, :(
            return false;
        }
    }

    $wpFileEndpoint = new FileEndpoint();
    $wpFileEndpoint->init();

endif; // FileEndpoint
2
jgraup