6

プログラムで WordPress のユーザー アバターを変更することは可能ですか? 現在、WordPress マルチサイトでユーザー アバターを表示する際に問題に直面しているため、質問しています。アバターが表示されません。

4

4 に答える 4

4

リモート URL でホストされているアバターから始めて、WordPress にユーザー アバターをプログラムで挿入できるようにするために、3 つのことを行う必要がありました。

  1. WP User Avatarプラグインをインストールします。
  2. WooCommerce からアップロード機能を借ります。下記参照。
  3. 同様のサポート投稿からいくつかのコードを適応させる

アバターが$avatar_url = 'http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon@2.png?v=73d79a89bded&a';

upload_product_image()WooCommerce のを使用してclass-wc-api-products.php、アバターをローカル サーバーに取り込みます。

次に、このサポート投稿のコードの一部を使用して、添付ファイルを作成します。次に、添付ファイルをユーザーに関連付けます。

これは、WP User Avatar プラグインでのみ機能します。

function se13911452_set_avatar_url($avatar_url, $user_id) {
        global $wpdb;
        $file = upload_product_image($avatar_url);
        $wp_filetype = wp_check_filetype($file['file']);
        $attachment = array(
            'guid' => $file['url'],
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => preg_replace('/\.[^.]+$/', '', basename($file['file'])),
            'post_content' => '',
            'post_status' => 'inherit'
        );
        $attach_id = wp_insert_attachment($attachment, $file['file']);
        $attach_data = wp_generate_attachment_metadata($attach_id, $file['file']);
        wp_update_attachment_metadata($attach_id, $attach_data);
        update_user_meta($user_id, $wpdb->get_blog_prefix() . 'user_avatar', $attach_id);
    }

WooCommerce class-wc-api-products.phpから

/**
 * WooCommerce class-wc-api-products.php
 * See https://github.com/justinshreve/woocommerce/blob/master/includes/api/class-wc-api-products.php
 * Upload image from URL
 *
 * @since 2.2
 * @param string $image_url
 * @return int|WP_Error attachment id
 */
function upload_product_image($image_url) {
    $file_name = basename(current(explode('?', $image_url)));
    $wp_filetype = wp_check_filetype($file_name, null);
    $parsed_url = @parse_url($image_url);

    // Check parsed URL
    if(!$parsed_url || !is_array($parsed_url)) {
        throw new WC_API_Exception('woocommerce_api_invalid_product_image', sprintf(__('Invalid URL %s', 'woocommerce'), $image_url), 400);
    }

    // Ensure url is valid
    $image_url = str_replace(' ', '%20', $image_url);

    // Get the file
    $response = wp_safe_remote_get($image_url, array(
        'timeout' => 10
    ));

    if(is_wp_error($response) || 200 !== wp_remote_retrieve_response_code($response)) {
        throw new WC_API_Exception('woocommerce_api_invalid_remote_product_image', sprintf(__('Error getting remote image %s', 'woocommerce'), $image_url), 400);
    }

    // Ensure we have a file name and type
    if(!$wp_filetype['type']) {
        $headers = wp_remote_retrieve_headers($response);
        if(isset($headers['content-disposition']) && strstr($headers['content-disposition'], 'filename=')) {
            $disposition = end(explode('filename=', $headers['content-disposition']));
            $disposition = sanitize_file_name($disposition);
            $file_name = $disposition;
        }
        elseif(isset($headers['content-type']) && strstr($headers['content-type'], 'image/')) {
            $file_name = 'image.' . str_replace('image/', '', $headers['content-type']);
        }
        unset($headers);
    }

    // Upload the file
    $upload = wp_upload_bits($file_name, '', wp_remote_retrieve_body($response));

    if($upload['error']) {
        throw new WC_API_Exception('woocommerce_api_product_image_upload_error', $upload['error'], 400);
    }

    // Get filesize
    $filesize = filesize($upload['file']);

    if(0 == $filesize) {
        @unlink($upload['file']);
        unset($upload);
        throw new WC_API_Exception('woocommerce_api_product_image_upload_file_error', __('Zero size file downloaded', 'woocommerce'), 400);
    }

    unset($response);

    return $upload;
}
于 2015-12-12T01:12:07.087 に答える
2

ほとんどの場合、どこかでget_avatarフィルターが呼び出され、何かを実行しています。プラグインとテーマを検索して、get_avatar次のようなものを確認することをお勧めします。add_filter ('get_avatar', .....

それ以外の場合は、以下のコードを使用して独自の動作を記述できます。

<?php // in a plugin file or in a theme functions.php
function SO13911452_override_avatar ($avatar_html, $id_or_email, $size, $default, $alt) {
    // check all values

    return $avatar_html
}
add_filter ('get_avatar', 'SO13911452_override_avatar', 10, 5);
于 2012-12-17T09:56:08.140 に答える