it-swarm.com.de

Ist da ein WP Wie bekomme ich ein Filehandle?

Ich verwende eine externe CSV-Lesebibliothek, die ein Dateihandle (Ressource) als Argument verwendet. Ich verwende wp_handle_upload (), um die Datei tatsächlich zu verarbeiten und im Upload-Verzeichnis zu speichern, aber das gibt den Dateipfad zurück, keine Ressource.

Ist $filehandle = fopen( $file['file'], 'r' ) hier akzeptabel oder gibt es eine bessere WP Alternative? Ich sehe nichts, was in file.php oder anderswo, wo ich gesucht habe, auf die Rechnung passt.

3
Tom Auger

Was folgt, ist etwas kompliziert. Sie können wahrscheinlich einfach fopen oder file_get_contents ohne Probleme verwenden.

Es gibt das Dateisystem API . Was es betrifft, den Besitz einer Datei zu bestimmen und die richtige Art des Zugriffs darauf zurückzugeben - meistens bedeutet das nur normale PHP Funktionen (oder die direkten Dateisystemklasse).

Otto hat ein nettes Tutorial dazu, das ich kopiere/ändere, um herauszufinden, wie es für diese Antwort funktioniert.

Im Wesentlichen verwenden Sie request_filesystem_credentials , um die entsprechenden Informationen für die Interaktion mit dem Dateisystem abzurufen. Dies ist möglicherweise nichts (z. B. direkt, siehe Link oben) oder es wird dem Benutzer ein Formular angezeigt, damit er den Benutzernamen/das Kennwort für FTP oder SSH eingeben kann. Hängt von Ihrem Server-Setup ab.

Einige kurze Beispiele. Fügen wir eine Admin-Seite mit einem einfachen Formular hinzu.

<?php
add_action('admin_menu', 'wpse74395_add_menu_page');
function wpse74395_add_menu_page()
{
    add_options_page(
        __('Filesystem', 'wpse'),
        __('Filesystem', 'wpse'),
        'manage_options',
        'wpse-filesystem',
        'wpse74395_page_cb'
    );
}

function wpse74395_page_cb()
{
    if(wpse74395_use_filesystem())
        return;

    ?>
    <div class="wrap">
        <?php screen_icon(); ?>
        <h2><?php _e('Filesystem Practice', 'wpse'); ?></h2>
        <form method="post" action="">
            <?php wp_nonce_field('wpse74395-nonce'); ?>
            <p><input name="save" type="submit" value="<?php esc_attr_e('Go!', 'wpse'); ?>" class="button-primary" /></p>
        </form>
    </div>
    <?php
}

Die wpse74395_use_filesystem Funktion:

<?php
function wpse74395_use_filesystem()
{
    if(empty($_POST['save']))
        return false;

    // can we do this?
    check_admin_referer('wpse74395-nonce');

    // try to get the filesystem credentials.
    $url = wp_nonce_url(admin_url('options-general.php?page=wpse-filesystem'), 'wpse74395-nonce');
    if(false === ($creds = request_filesystem_credentials($url)))
    {
        // we didn't get creds...
        // The user will see a form at this point, so stop the
        // rest of the page.
        return true; 
    }

    // use WP_Filesystem to check initialize the global $wp_filesystem
    if(!WP_Filesystem($creds))
    {
        // didn't work, try again!
        request_filesystem_credentials($url);
        return true;
    }

    global $wp_filesystem;

    // get your file path
    $fp = WP_CONTENT_DIR . '/test.txt';

    // do your thing.
    if($wp_filesystem->exists($fp))
    {
        $res = $wp_filesystem->get_contents($fp);
        var_dump($res);
        return true;
    }

    // nothing worked, try again.
    return false;
}

Die Kommentare sollen erklären, was los ist. Grundsätzlich gilt: Stellen Sie sicher, dass eine POST -Anforderung vorliegt (Formularübermittlung) und die Anforderung ausgecheckt ist (Nonce-Validierung). Von dort versuchen wir, Anmeldeinformationen für das Dateisystem abzurufen. Wenn wir keine erhalten, wird ein Formular angezeigt, in dem sie gesammelt werden. Beenden Sie daher die Anzeige des restlichen Teils der Seite.

Indem wir nur request_filesystem_credentials als erstes Argument angeben, können wir WP entscheiden, welche Methode wir verwenden müssen. Meistens ist dies direkt und der Benutzer sieht nichts. Bitte beachte, dass request_filesystem_credentials alles in seiner Macht Stehende tut, um das Zeug zu bekommen, ohne den Benutzer zu fragen - Datenbankoptionen, Konfigurationsoptionen usw.

Versuchen Sie, das globale $wp_filesystem-Objekt mit WP_Filesystem zu initialisieren, sobald wir die creds haben. Wenn es funktioniert, super! Wenn nicht, versuchen Sie erneut, die Anmeldeinformationen abzurufen.

Wenn alles ausgecheckt ist, verwenden Sie den $wp_filesystem nach Bedarf. Sie haben alle eine einheitliche Oberfläche. Hier ist der obige Code in einem Plugin .

3
chrisguitarguy

WordPress verwenden nicht fopen(). Das WordPress-Dateisystem verwendet vier Methoden, um auf eine Datei zuzugreifen:

  • file_get_contents() (Methode direkt)
  • sockets über eine FTP-Klasse (Methode ftpsockets)
  • fTP über ftp_connect()/ftp_ssl_connect() (Methode ftpext)
  • ssh2 über ssh2_connect() (Methode ssh2)

Sie müssen das Dateihandle mit fopen() selbst erstellen. Wenn Sie wp_handle_upload() verwenden, sollte WordPress die Datei bereinigt und überprüft haben. $file['file'] sollte sauber und verwendbar sein.

1
Ralf912