web-dev-qa-db-fra.com

Y a t-il WP Manière d'obtenir un descripteur de fichier?

J'utilise une bibliothèque de lecture CSV externe qui prend un descripteur de fichier (ressource) en argument. J'utilise wp_handle_upload () pour traiter et stocker le fichier dans le répertoire Uploads, mais cela renvoie le chemin du fichier, pas une ressource.

$filehandle = fopen( $file['file'], 'r' ) est-il acceptable ici ou existe-t-il une meilleure WP alternative? Je ne vois rien qui corresponde à la facture dans file.php, ni nulle part ailleurs où j'ai regardé.

3
Tom Auger

Ce qui suit est un peu compliqué. Vous pouvez probablement simplement utiliser fopen ou file_get_contents sans aucun problème.

Il y a le api du système de fichiers . Qui traite de la détermination de la propriété d’un fichier et de la restitution de la manière correcte d’y accéder - la plupart du temps, cela signifie simplement des fonctions PHP normales (ou les fonctions directes classe de système de fichiers).

Otto a un beau tutoriel sur lequel je suis copié/modifié pour comprendre comment cela fonctionne pour cette réponse.

Vous utilisez essentiellement request_filesystem_credentials pour obtenir les informations appropriées afin d’interagir avec le système de fichiers. Il peut s’agir de rien (par exemple, direct, voir le lien ci-dessus) ou montrer un formulaire à l’utilisateur afin qu’il puisse entrer le nom d’utilisateur/mot de passe pour FTP ou SSH. Cela dépend de la configuration de votre serveur.

Quelques exemples rapides. Ajoutons une page d'administrateur, avec un formulaire simple.

<?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
}

La fonction wpse74395_use_filesystem:

<?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;
}

Les commentaires devraient aider à expliquer ce qui se passe. Essentiellement: assurez-vous que nous sommes dans une demande POST] (soumission du formulaire) et que la demande soit extraite (validation nonce). À partir de là, nous allons essayer d'obtenir les informations d'identification du système de fichiers. Si nous n'en obtenons pas, un formulaire s'affichera pour les collecter. Arrêtez donc le reste de la page.

En ne donnant que le premier argument à request_filesystem_credentials, nous permettons à WP de décider de la méthode à utiliser. La plupart du temps, c'est direct et l'utilisateur ne voit rien. Veuillez noter que request_filesystem_credentials fera tout ce qui est en son pouvoir pour obtenir le contenu sans demander à l'utilisateur - options de base de données, options de configuration, etc.

Une fois que nous avons les creds, essayez d’initialiser l’objet global $wp_filesystem avec WP_Filesystem. Si cela fonctionne, génial! Sinon, essayez de récupérer les informations d'identification.

Si tout se passe bien, utilisez le $wp_filesystem selon vos besoins. Ils ont tous une interface cohérente. Voici le code ci-dessus dans un plugin .

3
chrisguitarguy

WordPress n'utilise pas fopen(). Le système de fichiers WordPress utilise quatre méthodes pour accéder à un fichier:

  • file_get_contents() (méthode direct)
  • des sockets via une classe ftp (méthode ftpsockets)
  • ftp via ftp_connect()/ftp_ssl_connect() (méthode ftpext)
  • ssh2 via ssh2_connect() (méthode ssh2)

Vous devez créer vous-même le descripteur de fichier avec fopen(). Lorsque vous utilisez wp_handle_upload(), WordPress aurait dû nettoyer et vérifier le fichier. $file['file'] devrait être propre et utilisable.

1
Ralf912