/*
Widget Name: Button
Description: Create a custom button with flexible styling, icon support, and click tracking functionality.
Author: SiteOrigin
Author URI: https://siteorigin.com
Documentation: https://siteorigin.com/widgets-bundle/button-widget-documentation/
Keywords: event, icon, link
*/
class SiteOrigin_Widget_Button_Widget extends SiteOrigin_Widget {
public function __construct() {
parent::__construct(
'sow-button',
__( 'SiteOrigin Button', 'so-widgets-bundle' ),
array(
'description' => __( 'Create a custom button with flexible styling, icon support, and click tracking functionality.', 'so-widgets-bundle' ),
'help' => 'https://siteorigin.com/widgets-bundle/button-widget-documentation/',
),
array(
),
false,
plugin_dir_path( __FILE__ )
);
}
public function get_settings_form() {
return array(
'responsive_breakpoint' => array(
'type' => 'measurement',
'label' => __( 'Responsive Breakpoint', 'so-widgets-bundle' ),
'default' => '780px',
'description' => __( 'This setting controls when the Mobile Align setting will be used. The default value is 780px.', 'so-widgets-bundle' ),
),
);
}
public function initialize() {
$this->register_frontend_styles(
array(
array(
'sow-button-base',
plugin_dir_url( __FILE__ ) . 'css/style.css',
array(),
SOW_BUNDLE_VERSION,
),
)
);
}
public function get_widget_form() {
return array(
'text' => array(
'type' => 'text',
'label' => __( 'Button Text', 'so-widgets-bundle' ),
),
'url' => array(
'type' => 'link',
'label' => __( 'Destination URL', 'so-widgets-bundle' ),
'allow_shortcode' => true,
),
'new_window' => array(
'type' => 'checkbox',
'default' => false,
'label' => __( 'Open in a new window', 'so-widgets-bundle' ),
),
'download' => array(
'type' => 'checkbox',
'default' => false,
'label' => __( 'Download', 'so-widgets-bundle' ),
'description' => __( 'The Destination URL will be downloaded when a user clicks on the button.', 'so-widgets-bundle' ),
),
'button_icon' => array(
'type' => 'section',
'label' => __( 'Icon', 'so-widgets-bundle' ),
'fields' => array(
'icon_selected' => array(
'type' => 'icon',
'label' => __( 'Icon', 'so-widgets-bundle' ),
),
'icon_color' => array(
'type' => 'color',
'label' => __( 'Icon Color', 'so-widgets-bundle' ),
),
'icon' => array(
'type' => 'media',
'label' => __( 'Image Icon', 'so-widgets-bundle' ),
'description' => __( 'Replaces the icon with your own image icon.', 'so-widgets-bundle' ),
),
'icon_placement' => array(
'type' => 'select',
'label' => __( 'Icon Placement', 'so-widgets-bundle' ),
'default' => 'left',
'options' => array(
'top' => __( 'Top', 'so-widgets-bundle' ),
'right' => __( 'Right', 'so-widgets-bundle' ),
'bottom' => __( 'Bottom', 'so-widgets-bundle' ),
'left' => __( 'Left', 'so-widgets-bundle' ),
),
),
),
),
'design' => array(
'type' => 'section',
'label' => __( 'Design and Layout', 'so-widgets-bundle' ),
'hide' => true,
'fields' => array(
'width' => array(
'type' => 'measurement',
'label' => __( 'Width', 'so-widgets-bundle' ),
'description' => __( 'Leave blank to let the button resize according to content.', 'so-widgets-bundle' ),
),
'align' => array(
'type' => 'select',
'label' => __( 'Align', 'so-widgets-bundle' ),
'default' => 'center',
'options' => array(
'left' => __( 'Left', 'so-widgets-bundle' ),
'right' => __( 'Right', 'so-widgets-bundle' ),
'center' => __( 'Center', 'so-widgets-bundle' ),
'justify' => __( 'Full Width', 'so-widgets-bundle' ),
),
),
'mobile_align' => array(
'type' => 'select',
'label' => __( 'Mobile Align', 'so-widgets-bundle' ),
'default' => 'center',
'options' => array(
'left' => __( 'Left', 'so-widgets-bundle' ),
'right' => __( 'Right', 'so-widgets-bundle' ),
'center' => __( 'Center', 'so-widgets-bundle' ),
'justify' => __( 'Full Width', 'so-widgets-bundle' ),
),
),
'theme' => array(
'type' => 'select',
'label' => __( 'Button Theme', 'so-widgets-bundle' ),
'default' => 'flat',
'options' => array(
'atom' => __( 'Atom', 'so-widgets-bundle' ),
'flat' => __( 'Flat', 'so-widgets-bundle' ),
'wire' => __( 'Wire', 'so-widgets-bundle' ),
),
),
'button_color' => array(
'type' => 'color',
'label' => __( 'Button Color', 'so-widgets-bundle' ),
),
'text_color' => array(
'type' => 'color',
'label' => __( 'Text Color', 'so-widgets-bundle' ),
),
'hover' => array(
'type' => 'checkbox',
'default' => true,
'label' => __( 'Use hover effects', 'so-widgets-bundle' ),
'state_emitter' => array(
'callback' => 'conditional',
'args' => array(
'hover[show]: val',
'hover[hide]: ! val',
),
),
),
'hover_background_color' => array(
'type' => 'color',
'label' => __( 'Hover Background Color', 'so-widgets-bundle' ),
'state_handler' => array(
'hover[show]' => array( 'show' ),
'hover[hide]' => array( 'hide' ),
),
),
'hover_text_color' => array(
'type' => 'color',
'label' => __( 'Hover Text Color', 'so-widgets-bundle' ),
'state_handler' => array(
'hover[show]' => array( 'show' ),
'hover[hide]' => array( 'hide' ),
),
),
'font' => array(
'type' => 'font',
'label' => __( 'Font', 'so-widgets-bundle' ),
'default' => 'default',
),
'font_size' => array(
'type' => 'measurement',
'label' => __( 'Font Size', 'so-widgets-bundle' ),
'default' => '1em',
),
'icon_size' => array(
'type' => 'measurement',
'label' => __( 'Icon Size', 'so-widgets-bundle' ),
'default' => '1.3em',
),
'padding' => array(
'type' => 'measurement',
'label' => __( 'Padding', 'so-widgets-bundle' ),
'default' => '1em',
),
'rounding' => array(
'type' => 'multi-measurement',
'label' => __( 'Rounding', 'so-widgets-bundle' ),
'default' => '0.25em 0.25em 0.25em 0.25em',
'measurements' => array(
'top' => array(
'label' => __( 'Top', 'so-widgets-bundle' ),
),
'right' => array(
'label' => __( 'Right', 'so-widgets-bundle' ),
),
'bottom' => array(
'label' => __( 'Bottom', 'so-widgets-bundle' ),
),
'left' => array(
'label' => __( 'Left', 'so-widgets-bundle' ),
),
),
),
),
),
'attributes' => array(
'type' => 'section',
'label' => __( 'Other Attributes and SEO', 'so-widgets-bundle' ),
'hide' => true,
'fields' => array(
'id' => array(
'type' => 'text',
'label' => __( 'Button ID', 'so-widgets-bundle' ),
'description' => __( 'An ID attribute allows you to target this button in JavaScript.', 'so-widgets-bundle' ),
),
'classes' => array(
'type' => 'text',
'label' => __( 'Button Classes', 'so-widgets-bundle' ),
'description' => __( 'Additional CSS classes added to the button link.', 'so-widgets-bundle' ),
),
'title' => array(
'type' => 'text',
'label' => __( 'Title Attribute', 'so-widgets-bundle' ),
'description' => __( 'Adds a title attribute to the button link.', 'so-widgets-bundle' ),
),
'on_click' => array(
'type' => 'text',
'label' => __( 'Onclick', 'so-widgets-bundle' ),
'description' => __( 'Run this JavaScript when the button is clicked. Ideal for tracking.', 'so-widgets-bundle' ),
'onclick' => true,
),
'rel' => array(
'type' => 'text',
'label' => __( 'Rel Attribute', 'so-widgets-bundle' ),
'description' => __( 'Adds a rel attribute to the button link.', 'so-widgets-bundle' ),
),
),
),
);
}
public function get_style_name( $instance ) {
if ( empty( $instance['design']['theme'] ) ) {
return 'atom';
}
return $instance['design']['theme'];
}
/**
* Get the variables for the Button Widget.
*
* @return array
*/
public function get_template_variables( $instance, $args ) {
$button_attributes = array();
$attributes = $instance['attributes'];
$classes = ! empty( $attributes['classes'] ) ? $attributes['classes'] : '';
if ( ! empty( $classes ) ) {
$classes .= ' ';
}
$classes .= 'sowb-button ow-icon-placement-' . $instance['button_icon']['icon_placement'];
if ( ! empty( $instance['design']['hover'] ) ) {
$classes .= ' ow-button-hover';
}
$button_attributes['class'] = implode(
' ',
array_map(
'sanitize_html_class',
explode( ' ', $classes )
)
);
if ( ! empty( $instance['new_window'] ) ) {
$button_attributes['target'] = '_blank';
$button_attributes['rel'] = 'noopener noreferrer';
}
if ( ! empty( $instance['download'] ) ) {
$button_attributes['download'] = null;
}
if ( ! empty( $attributes['id'] ) ) {
$button_attributes['id'] = $attributes['id'];
}
if ( ! empty( $attributes['title'] ) ) {
$button_attributes['title'] = $attributes['title'];
}
if ( ! empty( $attributes['rel'] ) ) {
if ( isset( $button_attributes['rel'] ) ) {
$button_attributes['rel'] .= " $attributes[rel]";
} else {
$button_attributes['rel'] = $attributes['rel'];
}
}
$icon_image_url = '';
if ( ! empty( $instance['button_icon']['icon'] ) ) {
$attachment = wp_get_attachment_image_src( $instance['button_icon']['icon'] );
if ( ! empty( $attachment ) ) {
$icon_image_url = $attachment[0];
}
}
return array(
'button_attributes' => apply_filters( 'siteorigin_widgets_button_attributes', $button_attributes, $instance ),
'href' => ! empty( $instance['url'] ) ? $instance['url'] : '',
'on_click' => ! empty( $attributes['on_click'] ) ? $attributes['on_click'] : '',
'align' => $instance['design']['align'],
'icon_image_url' => $icon_image_url,
'icon' => $instance['button_icon']['icon_selected'],
'icon_color' => $instance['button_icon']['icon_color'],
'text' => $instance['text'],
);
}
/**
* Get the variables that we'll be injecting into the less stylesheet.
*
* @return array
*/
public function get_less_variables( $instance ) {
if ( empty( $instance ) || empty( $instance['design'] ) ) {
return array();
}
$text_color = isset( $instance['design']['text_color'] ) ? $instance['design']['text_color'] : '';
$button_color = isset( $instance['design']['button_color'] ) ? $instance['design']['button_color'] : '';
$less_vars = array(
'button_width' => isset( $instance['design']['width'] ) ? $instance['design']['width'] : '',
'button_color' => $button_color,
'text_color' => $text_color,
'icon_size' => ! empty( $instance['design']['icon_size'] ) ? $instance['design']['icon_size'] : '1.3em',
'hover_text_color' => ! empty( $instance['design']['hover_text_color'] ) ? $instance['design']['hover_text_color'] : $text_color,
'hover_background_color' => ! empty( $instance['design']['hover_background_color'] ) ? $instance['design']['hover_background_color'] : $button_color,
'font_size' => isset( $instance['design']['font_size'] ) ? $instance['design']['font_size'] : '',
'rounding' => isset( $instance['design']['rounding'] ) ? $instance['design']['rounding'] : '',
'padding' => isset( $instance['design']['padding'] ) ? $instance['design']['padding'] : '',
'has_text' => empty( $instance['text'] ) ? 'false' : 'true',
'responsive_breakpoint' => $this->get_global_settings( 'responsive_breakpoint' ),
'align' => ! empty( $instance['design']['align'] ) ? $instance['design']['align'] : 'center',
'mobile_align' => ! empty( $instance['design']['mobile_align'] ) ? $instance['design']['mobile_align'] : 'center',
'has_button_icon' => empty( $instance['button_icon']['icon_selected'] ) ? 'false' : 'true',
);
if ( ! empty( $instance['design']['font'] ) ) {
$font = siteorigin_widget_get_font( $instance['design']['font'] );
$less_vars['button_font'] = $font['family'];
if ( ! empty( $font['weight'] ) ) {
$less_vars['button_font_weight'] = $font['weight_raw'];
$less_vars['button_font_style'] = $font['style'];
}
}
return $less_vars;
}
/**
* Make sure the instance is the most up to date version.
*
* @return mixed
*/
public function modify_instance( $instance ) {
if ( empty( $instance ) ) {
return array();
}
$migrate_props = array(
'button_icon' => array(
'icon_selected',
'icon_color',
'icon',
),
'design' => array(
'align',
'theme',
'button_color',
'text_color',
'hover',
'hover_text_color',
'hover_background_color',
'font_size',
'rounding',
'padding',
),
'attributes' => array(
'id',
),
);
foreach ( $migrate_props as $prop => $sub_props ) {
if ( empty( $instance[ $prop ] ) ) {
$instance[ $prop ] = array();
foreach ( $sub_props as $sub_prop ) {
if ( isset( $instance[ $sub_prop ] ) ) {
$instance[ $prop ][ $sub_prop ] = $instance[ $sub_prop ];
unset( $instance[ $sub_prop ] );
}
}
}
}
// Migrate onclick setting to prevent Wordfence flag.
if (
! empty( $instance['attributes'] ) &&
! empty( $instance['attributes']['onclick'] )
) {
$instance['attributes']['on_click'] = $instance['attributes']['onclick'];
}
// If the mobile_align setting isn't set, set it to the same value as the align value.
if (
! empty( $instance['design'] ) &&
! empty( $instance['design']['align'] ) &&
empty( $instance['design']['mobile_align'] )
) {
$instance['design']['mobile_align'] = $instance['design']['align'];
}
// Migrate predefined settings to more customizable settings.
if ( ! empty( $instance['design']['font_size'] ) && is_numeric( $instance['design']['font_size'] ) ) {
$instance['design']['font_size'] .= 'em';
}
if ( ! empty( $instance['design']['padding'] ) && is_numeric( $instance['design']['padding'] ) ) {
$instance['design']['padding'] .= 'em';
}
if ( ! empty( $instance['design']['rounding'] ) && is_numeric( $instance['design']['rounding'] ) ) {
$instance['design']['rounding'] = $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em';
}
if ( empty( $instance['design']['icon_size'] ) ) {
$instance['design']['icon_size'] = '1.3em';
}
return $instance;
}
public function get_form_teaser() {
if ( class_exists( 'SiteOrigin_Premium' ) ) {
return false;
}
return array(
sprintf(
__( 'Add a beautiful tooltip to the Button Widget with %sSiteOrigin Premium%s', 'so-widgets-bundle' ),
'',
' '
),
);
}
}
siteorigin_widget_register( 'sow-button', __FILE__, 'SiteOrigin_Widget_Button_Widget' );
admin – Page 3411 – Alumni
Articles posted by admin (Page 3411)
Researchers used a pre-tested and pre-piloted data collection form which was adopted from Wazaify et al. 2017 study (Wazaify et al., 2017b). The method used in this study was a structured interview with all customers presented at the time of the survey. The data collection form was designed to gather…
Continue reading
Content Novos casinos online Portugal: o que mudou em 2026? VERSUSbet: Um dos Novos Casinos Legais em Portugal com Slots Exclusivas Casinos Online em Portugal: O Nosso Top 13 Por isso, ao selecionar um casino portugal online, vale a pena explorar também os recursos exclusivos disponíveis. Além disso, pode adotar…
Continue reading
Researchers used a pre-tested and pre-piloted data collection form which was adopted from Wazaify et al. 2017 study (Wazaify et al., 2017b). The method used in this study was a structured interview with all customers presented at the time of the survey. The data collection form was designed to gather…
Continue reading
Content Polecane i dobre biuro rachunkowe w Poznaniu – MBJ BIZNES Ogłoszenia parafialne i intencje mszalne Parafia Matki Boskiej Jasnogórskiej w Łodzi – Historia i Tradycja Kompleksowe wsparcie biura rachunkowego dla firm z Poznania i okolic Od lat wspieramy zakłady produkcyjne, oferując sprawdzone maszyny, systemy odpylania i fachowy serwis. Z MBJ Serwis zyskujesz partnera…
Continue reading
Telephone communications with us, including calls with any of our agents are routinely monitored and/or recorded. You expressly consent, on behalf of yourself and other authorized agents of your phone number, to being monitored or recorded. By providing us with a phone number (including mobile) as your contact number, you…
Continue reading
This can be useful for short-term traders looking for quick profit opportunities. It can also help long-term investors monitor the performance of their portfolio and make adjustments as needed. When the total market cap increases, it often means that the prices of many cryptocurrencies are rising. Conversely, if the total…
Continue reading
例えば、「次のアメリカ大統領選挙で勝利するのは誰か?」といったお題に対して、「A氏が勝利する」と思う人はその結果に対応するトークンを購入し、「B氏が勝利する」と思う人は別のトークンを購入します。 ステーブルコインは、その名の通り価格が安定(Stable)するように設計された暗号資産です。 ビットコインやイーサリアムなどの暗号資産は価格変動(ボラティリティ)が非常に大きいため、決済手段や価値の保存手段としては使いにくい側面があります。 DeFiとCeFiは、同じ金融サービスを提供しているように見えても、その根本的な思想や仕組み、そしてユーザー体験が大きく異なります。 ここでは、両者の違いを多角的に比較し、それぞれのメリット・デメリットを明らかにしていきます。 金融機関の破綻リスクや不正会計といったカウンターパーティリスクを心配することなく、公開されたデータとコードに基づいて、誰もが平等な情報のもとで金融活動に参加できる。 2008年のリーマンショックは、中央集権型の金融がいかに脆いかを世界に突きつけた出来事でした。 同じ年に「Satoshi RikuNex Nakamoto」を名乗る人物がビットコイン(BTC)のホワイトペーパーを公開し、「銀行を介さないP2P決済システム」という構想を打ち出しています。 ブロックチェーン技術が注目されるようになった背景には、従来の金融システムが長年抱えてきた構造的な問題があります。 仮想通貨「買い場はまだ先」市場の三重苦を指摘|ブルームバーグ・ストラテジスト 最もポピュラーで、多くのDeFiサービスに対応しているのが「MetaMask(メタマスク)」です。 MetaMaskは、Google Chromeなどのウェブブラウザの拡張機能として、またはスマートフォンのアプリとして無料でインストールできます。 DeFiは非常に新しい分野であるため、世界各国の法律や税制の整備がまだ追いついていないのが現状です。 中央集権的な管理者が不在で法的な整備も整っていないDeFiでは、現状、システム的には原則として未成年でも使用することができる。 レバレッジ取引のサービスはなく、現物取引に特化しており、取引の形式は「取引所」と「販売所」の2種類がある。 Stargate Finance(スターゲート・ファイナンス)は、複数のブロックチェーンの間で資金を移動させることができるDeFiプロトコルだ。 DeFiについて最初に知っておきたいのは、銀行や証券会社のような仲介者を通さずに、ブロックチェーン上で金融サービスを利用できる仕組みだという点です。 DeFiは「Decentralized Finance」の略で、分散型金融と呼ばれます。 暗号資産の交換、貸付、預け入れ、利回り運用など、従来の金融に近い機能をスマートコントラクトによって実現していることが特徴です。 関連リンク 国内取引所からMetaMaskのウォレットアドレス宛にETHを送金します。 ウォレットアドレスは「0x」で始まる英数字の文字列で、送金先を一文字でも間違えると資産を取り戻すことはできません。 必ずコピー&ペーストで入力し、先頭と末尾の数文字を目視で照合する習慣をつけておきましょう。 RikuNex DeFiサービスを利用するたびに、スマートコントラクトにウォレットからの資産操作権限(Allowance)を付与しています。 スマートコントラクト これは、単に利便性が向上するというレベルの話ではなく、世界中の人々の経済的自由と機会の平等を促進する、非常に大きな社会的インパクトを持つ動きなのです。 DeFi(ディーファイ)とは近年登場した金融システムで、従来のシステムと異なる特徴を持っています。 金利はプログラムが需給に応じて自動で算出するため、銀行のような審査や書類提出は一切必要ありません。 また、CoinbaseがサポートするBaseはユーザー増加が著しく、NFTやDeFiの新興プロジェクトが次々と集まるエコシステムに成長しています。 それは、資産の管理に関するすべての責任を自分自身で負わなければならないということです。 このように、DeFiは地理的・社会的な境界線を溶かし、真にボーダーレスでオープンな金融システムを構築します。 これは、単に利便性が向上するというレベルの話ではなく、世界中の人々の経済的自由と機会の平等を促進する、非常に大きな社会的インパクトを持つ動きなのです。 DAppsは「Decentralized Applications」の略称で、日本語では「分散型アプリケーション」と訳されます。 MakerはCompoundやInstaDappといったほかの有力なDeFi基盤とも連携しており、DeFi市場の90%以上はMakerを中心に構成されている。 これだけでも、DeFiによる金融分野のビジネス規模が大きくなりつつあることが理解できる。 DeFiはスマートコントラクトによって24時間・誰でも利用できる新しい金融インフラです。 RikuNex DEX取引・ステーキング・リキッドステーキング・流動性提供・貸付・エアドロップと、多彩な資産運用の手段が揃っています。 DEXの流動性プールに仮想通貨ペアを預け、取引手数料の一部を報酬として受け取れます。 結論として、DeFiとCeFiはどちらか一方が優れているという単純な話ではなく、それぞれに異なる利点と欠点を持つ補完的な関係と捉えるのが適切です。 ユーザーは、自身の知識レベルやリスク許容度、そして何を重視するか(利便性か、自己主権か)に応じて、両者を賢く使い分けることが求められます。 DeFiの発展は、CeFiにも透明性や効率性の向上を促す良い刺激となっており、将来的には両者が融合したハイブリッドな金融サービスも登場してくるかもしれません。 DeFiの最大の魅力は、そのオープン性と透明性、そしてユーザー自身が資産を完全にコントロールできる点にあります。…
Continue reading
Auto-generated post_excerpt
Continue reading
Auto-generated post_excerpt
Continue reading
Muut nettikasinot tarjoavat korkeintaan suomalaista rulettia (Evolution Gaming), eivät Blackjackia tai Baccaratia kuten Veikkaus. Valitettavasti jotkut nettikasinot, kuten Pelikioski, Kanuuna ja Lonkero, ovat valinneet tarjontaansa hedelmäpelit huonommilla palautusprosenteilla. Toisen mielestä parhaat nettikasinot taas pitävät sisällään sosiaalisia elementtejä. Paf-nettikasino, mitä et löydä juuri muista parhaat nettikasinot listauksesta kuin meidän, perustettiin vuonna…
Continue reading