0

ファビコンを変更するために、テーマ カスタマイザにイメージ コントロールを追加しました。問題は、.ico ファイルをアップロードできないことです。他のファイル形式 (.jpg、.png) とうまく連携します。現在、WP_Customize_Upload_Control() を使用してお気に入りのアイコンを変更しています。WP_Customize_Image_Control() を使用して .ico ファイルをアップロードする方法はありますか? このクラスについてCodexで利用できるドキュメントはありません。

前もって感謝します

4

3 に答える 3

1

WP Media Library で .ico MIME タイプを許可するには、いくつかのフィルターを使用する必要がありました。次に、Favicon アップロード用のカスタム設定ハンドラーとコントロールを作成しました。

  1. メディア ライブラリで .ico を許可する

    add_filter( 'getimagesize_mimes_to_exts', array($this, 'add_ico_mime'), 99999 );
    add_filter( 'upload_mimes', array($this, 'add_ico_ext'), 99999 );
    
    /*Add Ico Mime Type to Allowed Extension*/
    public function add_ico_mime( $mime ) {
        $mime[ 'image/vnd.microsoft.icon' ] = "ico";
        $mime[ 'image/x-icon' ]             = "ico";
        $mime[ 'image/ico' ]                = "ico";
        return $mime;
    }
    
    /*Add Ico File Extension to Allowed Mimes*/
    public function add_ico_ext( $site_mimes ) {
        if (isset($site_mimes['ico']) === false) $site_mimes['ico'] = 'image/vnd.microsoft.icon';
        return $site_mimes;
    }
    
  2. 設定ハンドラー

    /*Setup WP Customizer Options*/
    public $transport = 'refresh'; // 'PostMessage';
    public $option_type = 'theme_mod';
    
    /*Handle Uploader Settings*/
    public function add_favicon_control($setting_id, $section_id, $label = '', $priority = 0) {
        global $wp_customize, $theme_namespace;
    
        $setting_args = array(
        'type'              => $this->option_type,
        'capability'        => 'edit_theme_options',
        'transport'         => $this->transport,
        'sanitize_callback' => 'esc_url_raw',
        );
    
        $wp_customize->add_setting( $setting_id, $setting_args );
        $favicon_control = new Favicon_Control( $wp_customize, $setting_id, 
        array(
        'label'         => __( $label, $theme_namespace ),
        'section'       => "ds_theme_{$section_id}_section_id",
        'priority'      => $priority,
        'settings'      => $setting_id,
        'context'      => 'favicon'
        ) );
        $wp_customize->add_control( $favicon_control );
        return $favicon_control;
    }
    
  3. カスタム ファビコン コントロールを宣言する

    /*Custom Favicon Control Class    */
    class Favicon_Control 
    extends WP_Customize_Image_Control {
            public $setting_id;
    
            public function __construct( $manager, $id, $args = array() ) {
                $this->extensions[] = 'ico';
                $this->setting_id = $id;
                parent::__construct( $manager, $id, $args );
            }
    
            public function tab_uploaded() {
                $my_context_uploads = get_posts( array(
                'post_type'  => 'attachment',
                'meta_key'   => '_wp_attachment_context',
                'meta_value' => $this->context,
                'orderby'    => 'post_date',
                'nopaging'   => true,
                ) );
            ?>
    
            <div class="uploaded-target"></div>
    
            <?php
                if ( empty( $my_context_uploads ) )
                    return;
            ?>
            <div class="uploaded-favicons" data-controller="<?php esc_attr_e( $this->setting_id ); ?>">
                <?php
                    foreach ( (array) $my_context_uploads as $my_context_upload ) {
                        $this->print_tab_image( esc_url_raw( $my_context_upload->guid ) );
                    }
                ?>
            </div>
            <?php
            }
        }
    
  4. 最後に、ハンドラを初期化します

    /*Initialize Favicon Handler*/
    $this->add_favicon_control($setting_id, $section_id, $label, 80);
    
于 2014-08-28T07:56:03.190 に答える
0

私の解決策は、WP_Customize_Image_Control クラスを拡張して .ico ファイルを受け入れることでした。これを行うには、次のコードで「customize-favicon.php」という名前の新しいファイルを作成します。

<?php
class SO_Customize_Favicon_Control extends WP_Customize_Image_Control {
    public function __construct( $manager, $id, $args ) {

        $this->extensions[] = 'ico';

        return parent::__construct( $manager, $id, $args );
    }
}
?>

次に、customize_register コールバック関数で、新しいファイルにインクルードを追加し、標準のイメージ コントロール クラスを作成したばかりのものに置き換えます。

include 'customize-favicon.php';
$wp_manager->add_control( new Custom_Customize_Favicon_Control( $wp_manager, 'favicon_image', array(
    'label'   => 'Favicon Image (16x16 px or 32x32 px)',
    'section' => 'some_global_section',
    'settings'   => 'favicon_image',
    'priority' => 1,
) ) );
于 2013-12-25T10:13:27.903 に答える