• Resolved kazskater99

    (@kazskater99)


    <?php
    /*
    Plugin Name: Scroll Banner Plugin
    Description: スクロール調整でバナーを表示し、メディアライブラリーから選択できるプラグイン
    Version: 1.0
    Author: SANO
    */
    
    // プラグインのディレクトリパス
    $plugin_dir_path = plugin_dir_path(__FILE__);
    
    // プラグインのバージョン
    $plugin_version = '1.0';
    
    function scroll_banner_plugin_init_option() {
        // プラグイン初期化の処理を行う
        if (!get_option('scroll_banner_dynamic_scroll_start')) {
            // オプションが存在しない場合に初期値を設定
            add_option('scroll_banner_dynamic_scroll_start', 200);
        }
    
        // フラグを追加して有効ならプラグイン機能を実行
        if (get_option('scroll_banner_plugin_enabled', true)) {
            // プラグインの追加機能をここに追加
        }
    }
    
    
    
    // 他のプラグイン関連のコードや関数など...
    
    
    register_activation_hook(__FILE__, 'scroll_banner_plugin_init_option');
    
    class ScrollBannerPlugin {
        // コンストラクタ
        public function __construct() {
            // フロントエンドでのバナー制御
            // add_action('wp_footer', array($this, 'control_sticky_banner'));
    
            // コンテンツにバナーを追加
            add_filter('the_content', array($this, 'add_sticky_banner_to_content'));
    
            // 管理メニューにバナー設定を追加
            add_action('admin_menu', array($this, 'add_sticky_banner_menu'));
    
            // 管理画面設定の初期化
            add_action('admin_init', array($this, 'sticky_banner_settings_init'));
    
            // カラーピッカーの初期化
            add_action('admin_footer', array($this, 'initialize_color_picker'));
    
            // Ajaxでオプションを保存
            add_action('wp_ajax_save_option_via_ajax', array($this, 'save_option_via_ajax'));
            add_action('wp_ajax_nopriv_save_option_via_ajax', array($this, 'save_option_via_ajax'));
    
    
     // Ajaxレスポンスを処理するアクションフック
        //add_action('wp_ajax_save_selected_banner_id', array($this, 'save_selected_banner_id'));
        //add_action('wp_ajax_nopriv_save_selected_banner_id', array($this, 'save_selected_banner_id'));
    
    
    
            // Ajaxを読み込ませるアクションフック
            add_action('wp_ajax_save_user_hide_banner_option', array($this, 'save_user_hide_banner_option_callback'));
            //add_action('wp_ajax_new_banner_image', array($this, 'new_banner_image_callback'));
    
            /* ダイナミックスクロールのスタートの位置 */
    
            // ログインユーザーによるAjaxリクエストを処理するアクションフック
            add_action('wp_ajax_get_dynamic_scroll_start', array($this, 'dynamic_scroll_threshold_callback_server'));
    
            // 非ログインユーザーによるAjaxリクエストを処理するアクションフック ユーザーがログインしていない場合に実行
            add_action('wp_ajax_nopriv_get_dynamic_scroll_start', array($this, 'dynamic_scroll_threshold_callback_server'));
    
            /* チェックマークボタンの表示と非表示 */
    
            // クライアントサイドでのAjaxリクエストを処理するアクションフック
            add_action('wp_ajax_get_dynamic_scroll_start_client', array($this, 'dynamic_scroll_threshold_callback_client'));
    
          
    
            /* ダイナミックスクロールの値 */
    
            // サーバーサイドのAjaxアクションの追加
            add_action('wp_ajax_dynamic_scroll_threshold_server', array($this, 'dynamic_scroll_threshold_callback_server'));
    
            // wp_enqueue_scripts フックでスクリプトをエンキュー
            add_action('wp_enqueue_scripts', array($this, 'enqueue_my_scripts'));
    
    
    
    //add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
    
    
    add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_styles'));
    
    // クライアントサイドのAjaxアクションの追加 ユーザーがログインしている場合に実行
    add_action('wp_ajax_dynamic_scroll_threshold_client', array($this, 'dynamic_scroll_threshold_callback_client'));
    
    // Corrected: Use class method as callback
    add_action('admin_enqueue_scripts', array($this, 'enqueue_media_files'));
    
    // Corrected: Use class method as callback
    add_action('admin_footer', array($this, 'add_media_library_script'));
    
    // Corrected: Use class method as callback
    //add_action('admin_enqueue_scripts', array($this, 'my_enqueue_scripts'));
        
    
    add_action('wp_ajax_save_selected_banner_id', array($this, 'save_selected_banner_id_callback'));
    
    add_action('wp_ajax_nopriv_save_selected_banner_id', array($this, 'save_selected_banner_id_callback'));
    
    
    
        }
    
    // メディアライブラリのスクリプトを追加するメソッド
        //public function add_media_library_script() {
            //wp_enqueue_script('your-media-library-script-handle', plugin_dir_url(__FILE__) . 'js/back-script.js', array('jquery'), '1.0', true);
    
            //wp_localize_script('your-media-library-script-handle', 'yourScriptData', array(
                //'newBannerFieldID' => 'new-banner-id', // 新しいバナー画像のフィールドID
                 //他に必要なデータがあれば追加
            //));
        //}
    
    // メディアライブラリのスクリプトを追加するメソッド
    //public function add_media_library_script() {
        //wp_enqueue_script('your-media-library-script-handle', plugin_dir_url(__FILE__) . 'js/back-script.js', array('jquery'), '1.0', true);
    //}
    
    
    
    
        // 他のメソッドやプロパティがあれば追加
    
        // wp_enqueue_scripts フックでスクリプトをエンキュー
        //public function my_enqueue_scripts() {
            // ここにスクリプトのエンキュー処理を追加
        //}
    
    
        // 他のメソッドやプロパティがあれば追加
    
        // wp_enqueue_scripts フックでスクリプトをエンキュー
        public function enqueue_my_scripts() {
            // プラグインのディレクトリURLを取得
            $plugin_dir_url = plugin_dir_url(__FILE__);
    
            // プラグインのバージョンを取得
            $plugin_version = '1.0';  // プラグインのバージョンを設定
    
            // JSファイルをエンキュー
            wp_enqueue_script(
                'front-script',
                $plugin_dir_url . 'js/front-script.js',
                array('jquery'), // jQuery が必要な場合は指定
                $plugin_version,
                true
            );
    
            // ローカライズスクリプト
            wp_localize_script('front-script', 'myPluginData', array(
                'ajaxUrl' => esc_url(admin_url('admin-ajax.php')),
                'nonce'   => wp_create_nonce('sticky-banner-nonce'),
            ));
    
            // ローカライズスクリプト
            //wp_localize_script('my-behind-script', 'myAdminData', array(
                //'ajaxUrl' => admin_url('admin-ajax.php'), // AjaxのURLを追加
                //'nonce'   => wp_create_nonce('sticky-banner-nonce'), // Nonceを追加
                // ここに必要なデータを追加
            //));
        }
    
    
    
    //admin.js admin.css などのファイルは競合しやすい名前なのでファイルは作成しない。
    
    
    
    
    // メディアライブラリのスクリプトを追加するメソッド
    public function add_media_library_script() {
        // メディアライブラリのスクリプトをエンキュー
        wp_enqueue_script('your-media-library-script-handle', plugin_dir_url(__FILE__) . 'js/back-script.js', array('jquery'), '1.0', true);
    
        // wpColorPickerの初期化
        wp_enqueue_script('wp-color-picker');
        wp_enqueue_style('wp-color-picker');
    
        // メディアライブラリを開くためのスクリプトをローカライズ
        wp_localize_script('your-media-library-script-handle', 'myPluginData', array(
            'nonce' => wp_create_nonce('my-plugin-nonce'),
            'ajaxurl' => admin_url('admin-ajax.php')
        ));
    }
    
    
    
        // メディアライブラリのスクリプトをロード
        public function enqueue_media_files() {
            //if (!did_action('wp_enqueue_media')) {
                wp_enqueue_media();
            //}
        }
    
    
    // admin_enqueue_scripts フックでスタイルをエンキュー
    public function enqueue_admin_styles() {
        // プラグインのディレクトリURLを取得
        $plugin_dir_url = plugin_dir_url(__FILE__);
    
        // プラグインのバージョンを取得
        $plugin_version = '1.0';  // プラグインのバージョンを設定
    
        // CSSファイルをエンキュー
        wp_enqueue_style(
            'my-admin-styles',
            $plugin_dir_url . 'css/back-style.css',
            array(), // 依存関係がない場合は空の配列
            $plugin_version
        );
    }
    
        /* Ajax処理 */
    
    // バナー画像の保存
    //public function save_selected_banner_id() {
        //$this->check_ajax_referer_and_die();
    
        // POSTデータからバナーのIDを取得して保存
        //if (isset($_POST['banner_id'])) {
            //$banner_id = sanitize_text_field($_POST['banner_id']);
            //update_option('selected_banner_id', $banner_id);
        //}
    
        // POSTデータから新しいバナーのIDを取得して保存
        // if (isset($_POST['new_banner_id'])) {
        //     $new_banner_image_id = sanitize_text_field($_POST['new_banner_id']);
        //     update_option('new_banner_id', $new_banner_image_id);
        // }
    
        // Ajaxレスポンスを返す
        //echo json_encode(array('status' => 'success'));
        //wp_die(); // 必ず wp_die() を呼ぶ
    //}
    
    // バナー画像の保存
    //public function save_selected_banner_id() {
        // セキュリティトークンを確認
        //check_ajax_referer('sticky-banner-nonce', 'nonce');
    
        // POSTデータからバナーのIDを取得して保存
        //if (isset($_POST['banner_id'])) {
            //$banner_id = sanitize_text_field($_POST['banner_id']);
            //update_option('scroll_banner_id', $banner_id); // オプション名を 'scroll_banner_id' に変更
            //wp_send_json_success(array('message' => 'Banner ID saved successfully.'));
        //} else {
            //wp_send_json_error(array('message' => 'Banner ID is missing.'));
        //}
    //}
    
    // Ajaxリクエストを処理する関数
    function save_selected_banner_id_callback() {
        // Ajaxリクエストかどうかを確認
        check_ajax_referer('my_ajax_nonce', 'nonce');
    
        // バナーIDを受け取る
        if (isset($_POST['banner_id'])) {
            $banner_id = sanitize_text_field($_POST['banner_id']);
            update_option('scroll_banner_id', $banner_id);
            wp_send_json_success("Banner information saved successfully."); // 成功レスポンスを返す
        } else {
            wp_send_json_error("Error: Banner ID not provided."); // エラーレスポンスを返す
        }
    }
    
    
    
        // バナー画像URLの保存
        public function save_selected_image() {
            $this->check_ajax_referer_and_die();
    
            // POSTデータから画像URLを取得し、投稿IDに変換して保存
            $image_url = sanitize_text_field($_POST['image_url']);
            $attachment_id = attachment_url_to_postid($image_url);
            update_option('scroll_banner_id', $attachment_id);
    
            // Ajaxレスポンスを返す
            echo json_encode(array('status' => 'success'));
            wp_die(); // 必ず wp_die() を呼ぶ
        }
    
        // バナー非表示オプションの保存
        public function save_banner_hide_option() {
            $this->check_ajax_referer_and_die();
    
            // POSTデータからバナー非表示オプションを取得して保存
            $banner_hide = sanitize_text_field($_POST['banner_hide']);
            update_option('scroll_banner_hide', $banner_hide);
    
            // Ajaxレスポンスを返す
            echo json_encode(array('status' => 'success'));
            wp_die(); // 必ず wp_die() を呼ぶ
        }
    
        // バナーメッセージの色の保存
        public function save_banner_message_color_option_callback() {
            $this->check_ajax_referer_and_die();
    
            // POSTデータからバナーメッセージの色を取得
            $message_color = sanitize_text_field($_POST['message_color']);
            $hex_color_pattern = '/^#[0-9a-fA-F]+$/';
    
            // 色の形式が正しいか確認してから保存
            if (preg_match($hex_color_pattern, $message_color)) {
                echo json_encode(array('status' => 'success', 'message' => 'Color option saved successfully.'));
            } else {
                echo json_encode(array('status' => 'error', 'message' => 'Invalid color code.'));
            }
    
            wp_die(); // 必ず wp_die() を呼ぶ
        }
    
        // 文字背景色のオプションの保存
        public function save_banner_message_text_background_color_option_callback() {
            $this->check_ajax_referer_and_die();
    
            // POSTデータから文字背景色を取得
            $text_background_color = sanitize_text_field($_POST['text_background_color']);
            $hex_color_pattern = '/^#[0-9a-fA-F]+$/'; // 色の正規表現パターン
    
            // 色の形式が正しいか確認してから保存
            if (preg_match($hex_color_pattern, $text_background_color)) {
                // 正しい色の場合
                update_option('scroll_banner_message_background_color', $text_background_color);
                echo json_encode(array('status' => 'success', 'message' => 'Text background color option saved successfully.'));
            } else {
                // 無効な色コードの場合
                echo json_encode(array('status' => 'error', 'message' => 'Invalid text background color code.'));
            }
    
            wp_die(); // 必ず wp_die() を呼ぶ
        }
    
        // ユーザーがバナーを非表示にするオプションの保存
        public function save_user_hide_banner_option_callback() {
            $this->check_ajax_referer_and_die();
    
            // チェックボックスの状態を取得
            $banner_hide = isset($_POST['banner_hide']) ? sanitize_text_field($_POST['banner_hide']) : 'no';
    
            // デバッグメッセージの追加
            error_log('Banner Hide State: ' . $banner_hide);
    
            // 非表示オプションを保存
            update_option('user_hide_banner_option', $banner_hide);
    
            // デバッグメッセージの追加
            error_log('Option Saved: user_hide_banner_option = ' . $banner_hide);
    
            // 必ず wp_die を呼ぶ
            wp_die();
        }
    
    
    // サーバーサイドのAjaxアクションの追加
        public function dynamic_scroll_threshold_callback_server() {
            $this->check_ajax_referer_and_die();
    
            if (isset($_GET['scroll_position'])) {
                // 新しいスクロール位置が送信された場合、保存
                $new_scroll_position = sanitize_text_field($_GET['scroll_position']);
                update_option('scroll_banner_dynamic_scroll_start', $new_scroll_position);
            } else {
                // 動的なスクロール起点を取得
                $dynamic_scroll_start = intval(get_option('scroll_banner_dynamic_scroll_start', 200));
                $dynamic_scroll_start = min($dynamic_scroll_start, 1000);
    
                // クライアントサイドに動的なスクロール起点を返す
                echo json_encode($dynamic_scroll_start);
            }
    
            wp_die();
        }
    
    
    
    
    // クライアントサイドの処理 スクロールの動き
    public function dynamic_scroll_threshold_callback_client() {
    
        // プラグインのディレクトリURLを取得
        $plugin_dir_url = plugin_dir_url(__FILE__);
    
        // プラグインのバージョンを取得
        $plugin_version = '1.0';  // プラグインのバージョンを設定
    
        // JSファイルをエンキュー
        wp_enqueue_script(
            'my-behind-script',
            $plugin_dir_url . 'js/behind-script.js',
            array('jquery'), // 必要に応じて追加の依存関係を指定
            $plugin_version,
            true
        );
    
        // ローカライズスクリプト
        //wp_localize_script('my-behind-script', 'myAdminData', array(
            //'ajaxUrl' => admin_url('admin-ajax.php'), // AjaxのURLを追加
            //'nonce'   => wp_create_nonce('sticky-banner-nonce'), // Nonceを追加
            // ここに必要なデータを追加
        //));
    
        // HTML を返す代わりにデータを返す
        $response = array(
            'html' => '<input type="number" id="scrollInputField" name="scroll_banner_dynamic_scroll_start" min="200" max="1000" />',
            'description' => '<p class="description">現在のスクロール閾値: <span id="currentThreshold"></span></p>',
        );
    
        // JSON形式でレスポンスを返す
        wp_send_json($response);
    }
    
    
    
    // Ajaxリクエストの安全性を確認して wp_die() を呼ぶ
    // アクションフックはいらない。
    private function check_ajax_referer_and_die() {
        $nonce = $_REQUEST['nonce'];
    
        // Ajax refererを確認し、無効な場合は停止
        check_ajax_referer('sticky-banner-nonce', 'nonce', true);
        
        // ここで wp_die() を明示的に呼び出す必要はありません。check_ajax_referer() が処理します
    }
    
    
    
    
    // クライアントサーバー バナーの表示とチェックボックスの表示
    public function display_sticky_banner() {
       // バナー関連のオプション名の修正
    $banner_id = get_option('scroll_banner_id');
    $banner_hide = get_option('scroll_banner_hide', 'no');
    $banner_message = get_option('scroll_banner_message', '');
    $banner_link = get_option('scroll_banner_link', '');
    $message_font_weight = get_option('scroll_banner_message_font_weight', 'normal');
    $background_color = get_option('scroll_banner_message_background_color', '#ffffff');
    
        // 新しいバナーの表示処理
        //$new_banner_id = get_option('new_banner_id');
        $new_banner_message = get_option('banner_message');
        $new_banner_link = get_option('banner_link');
    
        // バナーが有効で非表示設定がされていない場合のみ表示
        if (($banner_id && $banner_hide !== 'yes') || is_admin()) {
            echo '<div id="scroll-banner">';
            echo '<div>';
            echo '<input type="checkbox" id="user-hide-banner-checkbox">';
            echo '<label id="hide-banner-label" style="display: none;">Hide Banner</label>';
            echo '</div>';
    
            // バナーリンクが設定されていればリンクを表示
            if (!empty($banner_link)) {
                echo '<a href="' . esc_url($banner_link) . '">';
            }
    
            // バナー画像を表示 自動的に高さ 幅のHTMLを出力する lazyload が対応されている。
            echo wp_get_attachment_image($banner_id, 'full');
    
            // バナーリンクが設定されていればリンクを閉じる
            if (!empty($banner_link)) {
                echo '</a>';
            }
    
            // バナーメッセージが設定されていれば表示
            if (!empty($banner_message)) {
                // javascriptでフォントサイズと単位を取得を動的に取得
                $font_size = esc_attr(get_option('scroll_banner_message_font_size', '16'));
                $font_unit = esc_attr(get_option('scroll_banner_message_font_unit', 'px'));
    
                echo '<p id="banner-message" class="banner-message" style="color: ' . esc_attr(get_option('scroll_banner_message_color', '#000')) . '; font-weight: ' . esc_attr($message_font_weight) . '; background-color: ' . esc_attr($background_color) . '; font-size: ' . $font_size . $font_unit . ';">' . esc_html($banner_message) . '</p>';
            }
    
            echo '</div>';
    
            // 新しいバナーの表示処理
            /*
            if ($new_banner_id) {
                echo '<div id="new-scroll-banner">';
                echo wp_get_attachment_image($new_banner_id, 'full');
    
                if (!empty($new_banner_message)) {
                    echo '<p class="banner-message">' . esc_html($new_banner_message) . '</p>';
                }
    
                // メディアライブラリから新しいバナー画像を選択するためのボタン
                echo '<div class="media-uploader">';
                echo '<input type="hidden" name="new_banner_id" id="new-banner-id" value="' . esc_attr($new_banner_id) . '" />';
                echo '<button id="upload-new-banner" class="button">新しいバナー画像を選択</button>';
                echo '<button id="remove-new-banner" class="button" style="display: ' . ($new_banner_id ? 'inline-block' : 'none') . '">選択した画像を削除</button>';
                echo '</div>';
    
                // 選択したバナー画像のプレビュー
                if ($new_banner_id) {
                    echo '<div id="banner-image-preview">';
                    echo wp_get_attachment_image($new_banner_id, 'thumbnail');
                    echo '</div>';
                }
    
                echo '</div>';
            }
            */
        }
        ?>
        <script>
            document.addEventListener('DOMContentLoaded', function() {
                var hideBannerCheckboxId = 'user-hide-banner-checkbox';
    
                var checkbox = document.getElementById(hideBannerCheckboxId);
    
                if (checkbox) {
                    checkbox.addEventListener('change', function () {
                        var bannerHide = this.checked ? 'yes' : 'no';
    
                        var ajax = new XMLHttpRequest();
                        ajax.open('POST', '<?php echo admin_url('admin-ajax.php'); ?>');
                        ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                        ajax.onload = function () {
                            console.log('Ajax response:', ajax.response);
    
                            var hideBannerLabel = document.getElementById('hide-banner-label');
                            if (hideBannerLabel) {
                                if (bannerHide === 'yes') {
                                    hideBannerLabel.style.display = 'block';
                                    console.log('Displaying message');
                                } else {
                                    hideBannerLabel.style.display = 'none';
                                    console.log('Hiding message');
                                }
                            } else {
                                console.error('hide-banner-label element not found.');
                            }
                        };
    
                        ajax.onerror = function () {
                            console.error('Ajax request failed.');
                        };
    
                        ajax.send('action=save_user_hide_banner_option&nonce=<?php echo wp_create_nonce('sticky-banner-nonce'); ?>&banner_hide=' + bannerHide);
                    });
                } else {
                    console.error('user-hide-banner-checkbox element not found.');
                }
            });
        </script>
        <?php
    }
    
    
    
    // クライアントサイドでのバナーの位置の表示とチェックボックスの表示
    //public function control_sticky_banner() {
        
    //}
    
    
    
    
    
    
    
        //プラグインの管理画面ページ
        public function add_sticky_banner_to_content($content) {
            ob_start();
            $this->display_sticky_banner();
            $banner_html = ob_get_clean();
    
            return $banner_html . $content;
        }
    
        public function add_sticky_banner_menu() {
            add_options_page('Sticky Banner Settings', 'Sticky Banner', 'manage_options', 'sticky-banner-settings', array($this, 'display_sticky_banner_settings'));
        }
    
    public function display_sticky_banner_settings() {
        ?>
        <div class="wrap">
            <h2>Sticky Banner Settings</h2>
    
            <!-- バナーの表示エリア -->
            <!--<div id="preview-area">
                <p id="preview-message"></p>
                <a id="preview-link" href="#"></a>
                <div id="your-new-html">
                </div>
            </div>-->
    
            <!-- 設定フォーム -->
            <form method="post" action="options.php">
                <?php
                settings_fields('sticky_banner_settings');
                do_settings_sections('sticky-banner-settings');
                
                // バナーを表示
                $this->display_sticky_banner();
    
                submit_button();
                ?>
            </form>
    
        </div>
        <?php
    }
    
    
       /**
        * 設定ページの初期化と各種設定項目の登録を行う関数
        */
        public function sticky_banner_settings_init() {
            // 各設定項目の保存処理を WordPress に登録
            register_setting('sticky_banner_settings', 'scroll_banner_id');
            register_setting('sticky_banner_settings', 'scroll_banner_hide');
            register_setting('sticky_banner_settings', 'scroll_banner_message');
            register_setting('sticky_banner_settings', 'scroll_banner_link');
            register_setting('sticky_banner_settings', 'scroll_banner_message_color');
            register_setting('sticky_banner_settings', 'scroll_banner_message_font_size'); // フォントサイズの設定を追加
            register_setting('sticky_banner_settings', 'scroll_banner_message_font_weight'); // フォントウェイトの設定を追加
            register_setting('sticky_banner_settings', 'scroll_banner_message_background_color'); // フォントウェイトの設定を追加
      register_setting('sticky_banner_settings', 'banner_image_id');
        register_setting('sticky_banner_settings', 'banner_message');
        register_setting('sticky_banner_settings', 'banner_link');
        register_setting('sticky_banner_settings', 'scroll_banner_threshold');//スクルールの位置の保存
    
    
    
                //register_setting('sticky_banner_settings', 'get_dynamic_scroll_threshold'); // 
    
    
            // 他にも必要な設定項目があれば追加
    
    
    
            // 設定ページにセクションを追加
            add_settings_section('sticky_banner_section', 'Banner Settings', array($this, 'scroll_banner_section_callback'), 'sticky-banner-settings');
    
            // 各項目の表示とコールバック関数を設定ページに追加
    
            // バナーの選択
            add_settings_field('scroll_banner_id', 'バナー選択', array($this, 'scroll_banner_id_callback'), 'sticky-banner-settings', 'sticky_banner_section');
    
            // バナー非表示オプション
            add_settings_field('scroll_banner_hide', 'バナー非表示オプション', array($this, 'scroll_banner_hide_callback'), 'sticky-banner-settings', 'sticky_banner_section');
    
            // バナーメッセージ
            add_settings_field('scroll_banner_message', 'バナーメッセージ', array($this, 'scroll_banner_message_callback'), 'sticky-banner-settings', 'sticky_banner_section');
    
            // バナーメッセージの色
            add_settings_field('scroll_banner_message_color', 'バナーメッセージの色', array($this, 'scroll_banner_message_color_callback'), 'sticky-banner-settings', 'sticky_banner_section');
    
            // バナーメッセージのフォントサイズ
            add_settings_field('scroll_banner_message_font_size', 'バナーメッセージのフォントサイズ', array($this, 'scroll_banner_message_font_size_callback'), 'sticky-banner-settings', 'sticky_banner_section');
    
            // バナーメッセージのフォントウェイト
            add_settings_field('scroll_banner_message_font_weight', 'バナーメッセージのフォントウェイト', array($this, 'scroll_banner_message_font_weight_callback'), 'sticky-banner-settings', 'sticky_banner_section');
    
            // バナーリンク先URL
            add_settings_field('scroll_banner_link', 'バナーリンク先URL', array($this, 'scroll_banner_link_callback'), 'sticky-banner-settings', 'sticky_banner_section');
    
            // バナーメッセージの背景色
            add_settings_field('scroll_banner_message_background_color', 'バナーメッセージの背景色', array($this, 'scroll_banner_message_background_color_callback'), 'sticky-banner-settings', 'sticky_banner_section');
    
    // セクションの追加
    add_settings_section('dynamic_scroll_start_section', '動的なスクロール起点', array($this, 'dynamic_scroll_start_section_callback'), 'sticky-banner-settings');
    
    // フィールドの追加
    add_settings_field('scroll_banner_dynamic_scroll_start', '動的なスクロール起点', array($this, 'scroll_banner_dynamic_scroll_start_callback'), 'sticky-banner-settings', 'dynamic_scroll_start_section');
    
     }
    
    
        public function scroll_banner_section_callback() {
            // バナーの選択に関するセクションの表示
            echo 'Select your banner from the media library.';
        }
    
    
    
    
    
    // メディアライブラリー
    public function scroll_banner_id_callback() {
        // バナーIDの入力フィールドと選択ボタンの表示
        $banner_id = get_option('scroll_banner_id');
        echo '<input type="text" name="scroll_banner_id" value="' . esc_attr($banner_id) . '" />';
        echo '<button class="button button-primary" id="select-banner-button">バナーを選択</button>';
    }
    
    
    
    
    
        public function scroll_banner_hide_callback() {
            // バナー非表示オプションのチェックボックスの表示
            $banner_hide = get_option('scroll_banner_hide', 'no');
            echo '<input type="checkbox" name="scroll_banner_hide" id="hide-banner-checkbox" value="yes" ' . checked('yes', $banner_hide, false) . ' />';
        }
    
        public function scroll_banner_message_callback() {
            // バナーメッセージのテキストエリアの表示
            $banner_message = get_option('scroll_banner_message', '');
            echo '<textarea name="scroll_banner_message">' . esc_textarea($banner_message) . '</textarea>';
        }
    
        public function scroll_banner_message_color_callback() {
            // バナーメッセージの色を選択するカラーピッカーの表示
            $banner_message_color = get_option('scroll_banner_message_color', '#000');
            echo '<input type="text" name="scroll_banner_message_color" value="' . esc_attr($banner_message_color) . '" class="color-picker" data-default-color="#000" />';
        }
    
        public function initialize_color_picker() {
            // カラーピッカーの初期化用のスクリプトの表示
            ?>
            <script>
                jQuery(document).ready(function ($) {
                    $('.color-picker').wpColorPicker();
                });
            </script>
            <?php
        }
    
        public function scroll_banner_link_callback() {
            // バナーリンク先のページを選択するドロップダウンメニューの表示
            $banner_link = get_option('scroll_banner_link', '');
            ?>
            <select name="scroll_banner_link">
                <option value="">Select a page</option>
                <?php
                $pages = get_pages();
                foreach ($pages as $page) {
                    $selected = selected($banner_link, get_page_link($page->ID), false);
                    echo '<option value="' . esc_url(get_page_link($page->ID)) . '" ' . $selected . '>' . esc_html($page->post_title) . '</option>';
                }
                ?>
            </select>
            <?php
        }
    
    
    // セクションのコールバックメソッド
    public function dynamic_scroll_start_section_callback() {
        echo '<p>動的なスクロール起点の設定を行います。</p>';
    }
    
    // フィールドのコールバックメソッド
    public function scroll_banner_dynamic_scroll_start_callback() {
        $value = esc_attr(get_option('scroll_banner_dynamic_scroll_start', 200));
        echo '<input type="number" name="scroll_banner_dynamic_scroll_start" value="' . $value . '" step="1" />';
    }
    
    
    
    
    /*AJEX 保存*/
    
    
    
        // バナーメッセージのフォントサイズの設定フィールドと表示に関するコールバック
        public function scroll_banner_message_font_size_callback() {
            // 現在のフォントサイズと単位を取得
            $current_font_size = get_option('scroll_banner_message_font_size', '16');
            $current_unit = get_option('scroll_banner_message_font_unit', 'px');
            $min_font_size = 0; // フォントサイズの下限
            $max_font_size = 40; // フォントサイズの上限
    
            // フォントサイズの調整UIの生成
            echo '<input type="number" name="scroll_banner_message_font_size" value="' . esc_attr($current_font_size) . '" min="' . $min_font_size . '" max="' . $max_font_size . '" step="1" />';
    
            // 単位の選択UIの生成
            $units = array('px', 'em', 'rem'); // 使用可能な単位のリスト
    
            echo '<select name="scroll_banner_message_font_unit">';
            foreach ($units as $unit) {
                $selected = selected($current_unit, $unit, false);
                echo '<option value="' . esc_attr($unit) . '" ' . $selected . '>' . esc_html($unit) . '</option>';
            }
            echo '</select>';
    
            // フォントサイズの入力形式に関する説明文の表示
            echo '<p class="description">バナーメッセージのフォントサイズを直接入力してください(範囲: ' . $min_font_size . ' から ' . $max_font_size . ')。</p>';
        }
    
    
    
        // フォントウェイトの設定フィールド(バナーメッセージのフォントウェイト)の表示に関するコールバック
        public function scroll_banner_message_font_weight_callback() {
            // 現在のフォントウェイトを取得
            //get_option関数を使用して現在のフォントウェイトの値を取得し、それに基づいて選択肢が選択されているかどうかを確認
            $current_font_weight = get_option('scroll_banner_message_font_weight', 'normal');
    
            // 入力フィールドの生成
            echo '<select name="scroll_banner_message_font_weight">';
            echo '<option value="normal" ' . selected('normal', $current_font_weight, false) . '>Normal</option>';
            echo '<option value="bold" ' . selected('bold', $current_font_weight, false) . '>Bold</option>';
            // 他のフォントウェイトのオプションを追加することもできます
            echo '</select>';
            // フォントウェイトの選択に関する説明文の表示
            echo '<p class="description">バナーメッセージのフォントウェイトを選択してください。</p>';
        }
    
    
        public function scroll_banner_message_background_color_callback() {
            // バナーメッセージの背景色を選択するカラーピッカーの表示
            $background_color = get_option('scroll_banner_message_background_color', '#ffffff'); // デフォルトは白色
            echo '<input type="text" name="scroll_banner_message_background_color" value="' . esc_attr($background_color) . '" class="color-picker" data-default-color="#ffffff" />';
        }
    
    /*
    public function new_banner_image_callback() {
        // 新しいバナー画像のIDを取得
        $new_banner_image_id = get_option('new_banner_id');
    
        // ファイルメディアアップローダーフィールドの表示
        echo '<div class="media-uploader">';
        echo '<input type="hidden" name="new_banner_id" id="new-banner-id" value="' . esc_attr($new_banner_image_id) . '" />';
        echo '<button id="upload-new-banner" class="button">新しいバナー画像を選択</button>';
    
        // 選択した画像があれば「選択した画像を削除」ボタンを表示
        if ($new_banner_image_id) {
            echo '<button id="remove-new-banner" class="button">選択した画像を削除</button>';
        }
    
        echo '</div>';
    
    
        // 選択したバナー画像のプレビュー
        if ($new_banner_image_id) {
            echo '<div id="new-banner-preview">';
            echo wp_get_attachment_image($new_banner_image_id, 'thumbnail');
            echo '</div>';
        }
    
        // 新しいバナー画像に関する説明文
        echo '<p class="description">新しいバナー画像を選択してください。</p>';
    }
    */
    
    
    
    
    
    
    
        // Ajax経由でオプションを保存するためのメソッド
    
        // バナーを非表示チェックさせる
        public function save_option_via_ajax() {
            // Ajaxリクエストの安全性を確認
            check_ajax_referer('sticky-banner-nonce', 'nonce');
    
            // バナー非表示オプションが送信された場合、保存
            if (isset($_POST['banner_hide'])) {
                // バナー非表示オプションを取得して保存
                $banner_hide = sanitize_text_field($_POST['banner_hide']);
                update_option('scroll_banner_hide', $banner_hide);
            }
    
            // 画像URLが送信された場合、選択された画像を保存
            if (isset($_POST['image_url'])) {
                // 画像URLから添付ファイルのIDを取得
                $image_url = sanitize_text_field($_POST['image_url']);
                $attachment_id = attachment_url_to_postid($image_url);
    
                // 添付ファイルIDをオプションとして保存
                update_option('scroll_banner_id', $attachment_id);
            }
    
    
    
            // フォントサイズも保存する
    if (isset($_POST['scroll_banner_message_font_size'])) {
        $message_font_size = sanitize_text_field($_POST['scroll_banner_message_font_size']);
        update_option('scroll_banner_message_font_size', $message_font_size);
    }
    
    
            // フォントウェイトも保存する
            if (isset($_POST['scroll_banner_message_font_weight'])) {
                $message_font_weight = sanitize_text_field($_POST['scroll_banner_message_font_weight']);
                update_option('scroll_banner_message_font_weight', $message_font_weight);
            }
    
            // 背景色も保存する
            if (isset($_POST['scroll_banner_message_background_color'])) {
                $message_background_color = sanitize_text_field($_POST['scroll_banner_message_background_color']);
                update_option('scroll_banner_message_background_color', $message_background_color);
            }
    
            // バナーID
            if (isset($_POST['banner_id'])) {
                $banner_id = sanitize_text_field($_POST['banner_id']);
                update_option('scroll_banner_id', $banner_id);
            }
    
            // 選択したバナー画像のプレビューID
            //if (isset($_POST['new_banner_id'])) {
                //$new_banner_image_id = sanitize_text_field($_POST['new_banner_id']);
                //update_option('new_banner_id', $new_banner_image_id);
            //}
    
            // 新しいバナースクロール位置が送信された場合、保存
            if (isset($_GET['scroll_position'])) {
                $new_scroll_position = sanitize_text_field($_GET['scroll_position']);
                update_option('scroll_banner_dynamic_scroll_start', $new_scroll_position);
            }
    
    
    
    
    
    
            // Ajax レスポンスを返す
            echo json_encode(array('status' => 'success'));
            wp_die();
        }
    
    
    
    
    }
    // オブジェクトを生成
    $scrollBannerPlugin = new ScrollBannerPlugin();
    ?>
    
    
    
    jQuery(document).ready(function ($) {
        // バナー選択ボタンのクリックイベント
        $("#select-banner-button").on("click", function (e) {
            e.preventDefault();
            openMediaLibrary();
        });
    
        // メディアライブラリーを開く関数
        function openMediaLibrary() {
            var frame = wp.media({
                title: "Select Banner",
                multiple: false,
                library: { type: "image" },
                button: { text: "Select" },
            });
    
            // メディアが選択された時の処理
            frame.on("select", function () {
                var attachment = frame.state().get("selection").first().toJSON();
                var bannerId = attachment.id; // バナーのIDを取得
    
                // バナーIDを保存する関数を呼び出し
                saveBannerInfo(bannerId);
            });
    
            // メディアライブラリーを開く
            frame.open();
        }
    
        // バナーIDをサーバーに送信する関数
        function saveBannerInfo(bannerId) {
            // Ajaxリクエストを送信
            jQuery.ajax({
                type: 'POST',
                url: myPluginData.ajaxurl,
                data: {
                    action: 'save_selected_banner_id', // PHP側で実行するアクション
                    banner_id: bannerId, // バナーのID
                    nonce: myPluginData.nonce // nonce
                },
                success: function(response) {
                    console.log("Banner information saved successfully.");
                    // 成功した場合の処理を追加できます
                },
                error: function(xhr, status, error) {
                    console.error("Error saving banner information:", error);
                    // エラーが発生した場合の処理を追加できます
                }
            });
        }
    });
    

    I can not change use medeia library. help me please

    thank you

Viewing 5 replies - 1 through 5 (of 5 total)
Viewing 5 replies - 1 through 5 (of 5 total)
  • The topic ‘admin-ajax.php 403 (Forbidden)’ is closed to new replies.