web-dev-qa-db-ja.com

ありますか WP ファイルハンドルを取得する方法は?

引数としてファイルハンドル(リソース)を受け取る外部CSV読み込みライブラリを使用しています。私は実際にファイルを処理してUploadsディレクトリに保存するためにwp_handle_upload()を使っていますが、それはリソースではなくファイルパスを返します。

ここでは$filehandle = fopen( $file['file'], 'r' )は受け入れられますか、それとももっと良いWPの選択肢がありますか。私はfile.phpの請求書に当てはまるもの、あるいは私が見た他のどこにも見当たらない。

3
Tom Auger

以下は複雑です。おそらくfopenまたはfile_get_contentsを問題なく使用することができます。

filesystem api があります。これは、ファイルの所有権を判断し、それにアクセスする正しい方法を返すことを扱います - ほとんどの場合、これは通常のPHP関数(または direct ファイルシステムクラス)を意味します。

Ottoは Nice tutorial を持っていますが、これをコピー/修正してこの答えにどのように機能するかを理解しました。

ファイルシステムと対話するための適切な情報を取得するには、基本的に request_filesystem_credentials を使用します。これはなにもしないかもしれません(例えば直接、上記のリンクを見てください)またはそれは彼らがFTPかSSHのためにユーザ名/パスワードを入力できるようにユーザにフォームを示すかもしれません。サーバーの設定によって異なります。

いくつかの簡単な例。簡単なフォームで管理ページを追加しましょう。

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

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

コメントは何が起こっているのかを説明するのに役立つはずです。基本的に、POSTリクエストに入っていること(フォーム送信)と、そのリクエストがチェックアウトされていること(ノンス検証)を確認してください。そこから、ファイルシステムの資格情報を取得しようとします。取得できない場合は、それらを収集するためのフォームが表示されるので、ページの残りの部分は表示しないようにします。

最初の引数にrequest_filesystem_credentialsを指定するだけで、WPに使用するメソッドを決定させます。ほとんどの場合、これは直接的であり、ユーザーには何も表示されません。 request_filesystem_credentialsはユーザに問い合わせることなくものを手に入れるためにできることすべてをすることに注意してください - データベースオプション、設定オプションなど。

クレジットを取得したら、グローバル$wp_filesystemオブジェクトをWP_Filesystemで初期化します。うまくいけば、すごい!そうでない場合は、資格情報をもう一度取得してみます。

すべてチェックしたら、必要に応じて$wp_filesystemを使用してください。それらはすべて一貫したインターフェースを持っています。これが上記のコード プラグイン内 です。

3
chrisguitarguy

WordPressはfopen()を使用しません。 WordPressファイルシステムはファイルにアクセスするために4つの方法を使用します。

  • file_get_contents()(メソッド直接)
  • ftpクラス経由のソケット(メソッドftpsockets)
  • ftp_connect()/ftp_ssl_connect()経由のftp(メソッドftpext)
  • ssh2_connect()によるssh2(メソッドssh2)

fopen()を使って自分でファイルハンドルを作成しなければなりません。 wp_handle_upload()を使うときは、WordPressがファイルをサニタイズして検証しているはずです。 $file['file']は清潔で使いやすいはずです。

1
Ralf912