| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/clients/client2/web22/web/wp-content/themes/arni/wpsf-framework/classes/ |
Upload File : |
<?php
/*-------------------------------------------------------------------------------------------------
- This file is part of the WPSF package. -
- This package is Open Source Software. For the full copyright and license -
- information, please view the LICENSE file which was distributed with this -
- source code. -
- -
- @package WPSF -
- @author Varun Sridharan <varunsridharan23@gmail.com> -
-------------------------------------------------------------------------------------------------*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'WPSFramework_WC_Metabox' ) ) {
/**
* Class WPSFramework_WC_Metabox
*/
class WPSFramework_WC_Metabox extends WPSFramework_Abstract {
/**
* _instance
*
* @var null
*/
private static $_instance = null;
/**
* type
*
* @var string
*/
protected $type = 'wc_metabox';
/**
* options
*
* @var null
*/
public $options = null;
/**
* default_wc_tabs
*
* @var mixed|null|void
*/
public $default_wc_tabs = null;
/**
* fields
*
* @var array
*/
public $fields = array();
/**
* group_fields
*
* @var array
*/
public $group_fields = array();
/**
* groups_to_add
*
* @var array
*/
public $groups_to_add = array();
/**
* variation_errors
*
* @var array
*/
public $variation_errors = array();
/**
* variation_fields
*
* @var array
*/
public $variation_fields = array(
'pricing' => array(),
'options' => array(),
'inventory' => array(),
'dimensions' => array(),
'tax' => array(),
'download' => array(),
'default' => array(),
);
/**
* @return null|\WPSFramework_WC_Metabox
*/
public static function instance() {
if ( null === self::$_instance ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* WPSFramework_WC_Metabox constructor.
*
* @param array $options
*/
public function __construct( $options = array() ) {
$this->default_wc_tabs = apply_filters( 'wpsf_wc_default_tabs', array(
'general' => 'general_product_data',
'inventory' => 'inventory_product_data',
'shipping' => 'shipping_product_data',
'linked_product' => 'linked_product_data',
'attribute' => 'product_attributes',
'variations' => 'variable_product_options',
'advanced' => 'advanced_product_data',
) );
$this->init( $options );
}
/**
* @param $options
*/
public function init( $options ) {
if ( ! empty( $options ) ) {
$this->options = apply_filters( 'wpsf_wc_metabox_options', $options );
$this->addAction( 'load-post.php', 'handle_options' );
$this->addAction( 'load-post-new.php', 'handle_options' );
$this->addAction( 'wp_ajax_woocommerce_load_variations', 'handle_options', 1 );
$this->addAction( 'woocommerce_product_data_tabs', 'add_wc_tabs' );
$this->addAction( 'woocommerce_product_data_panels', 'add_wc_fields', 99 );
$this->addAction( 'admin_enqueue_scripts', 'load_style_script' );
$this->addAction( 'woocommerce_admin_process_product_object', 'save_product_data' );
$this->addAction( 'woocommerce_product_options_advanced', 'advanced_page' );
$this->addAction( 'woocommerce_product_options_general_product_data', 'general_page' );
$this->addAction( 'woocommerce_product_options_inventory_product_data', 'stock_page' );
$this->addAction( 'woocommerce_product_options_related', 'linked_page' );
$this->addAction( 'woocommerce_product_options_shipping', 'shipping_page' );
$this->addAction( 'woocommerce_save_product_variation', 'save_variation_fields', 10, 2 );
$this->addAction( 'woocommerce_variation_options', 'wc_variation_options', 10, 3 );
$this->addAction( 'woocommerce_variation_options_pricing', 'wc_variation_pricing', 10, 3 );
$this->addAction( 'woocommerce_variation_options_inventory', 'wc_variation_inventory', 10, 3 );
$this->addAction( 'woocommerce_variation_options_dimensions', 'wc_variation_dimensions', 10, 3 );
$this->addAction( 'woocommerce_variation_options_tax', 'wc_variation_tax', 10, 3 );
$this->addAction( 'woocommerce_variation_options_download', 'wc_variation_download', 10, 3 );
$this->addAction( 'woocommerce_product_after_variable_attributes', 'wc_variation_variable_attributes', 10, 3 );
}
}
/**
* @param $loop
* @param $variation_data
* @param $variation
*/
public function wc_variation_options( $loop, $variation_data, $variation ) {
echo $this->render_variation_fields( 'options', $loop, $variation );
}
/**
* @param $loop
* @param $variation_data
* @param $variation
*/
public function wc_variation_pricing( $loop, $variation_data, $variation ) {
echo $this->render_variation_fields( 'pricing', $loop, $variation );
}
/**
* @param $loop
* @param $variation_data
* @param $variation
*/
public function wc_variation_inventory( $loop, $variation_data, $variation ) {
echo $this->render_variation_fields( 'inventory', $loop, $variation );
}
/**
* @param $loop
* @param $variation_data
* @param $variation
*/
public function wc_variation_dimensions( $loop, $variation_data, $variation ) {
echo $this->render_variation_fields( 'dimensions', $loop, $variation );
}
/**
* @param $loop
* @param $variation_data
* @param $variation
*/
public function wc_variation_tax( $loop, $variation_data, $variation ) {
echo $this->render_variation_fields( 'tax', $loop, $variation );
}
/**
* @param $loop
* @param $variation_data
* @param $variation
*/
public function wc_variation_download( $loop, $variation_data, $variation ) {
echo $this->render_variation_fields( 'download', $loop, $variation );
}
/**
* @param $loop
* @param $variation_data
* @param $variation
*/
public function wc_variation_variable_attributes( $loop, $variation_data, $variation ) {
echo $this->render_variation_fields( 'default', $loop, $variation );
}
/**
* Advanced_page
*/
public function advanced_page() {
echo $this->_render_group_page( 'advanced' );
}
/**
* General_page
*/
public function general_page() {
echo $this->_render_group_page( 'general' );
}
/**
* Stock_page
*/
public function stock_page() {
echo $this->_render_group_page( 'inventory' );
}
/**
* Linked_page
*/
public function linked_page() {
echo $this->_render_group_page( 'linked_product' );
}
/**
* Shipping_page
*/
public function shipping_page() {
echo $this->_render_group_page( 'shipping' );
}
/**
* @param $type
* @param $loop
* @param $variation
*
* @return string
*/
public function render_variation_fields( $type, $loop, $variation ) {
if ( empty( $this->fields ) ) {
$this->handle_options();
}
$fieldss = isset( $this->variation_fields[ $type ] ) ? $this->variation_fields[ $type ] : $this->fields;
$variation_id = is_object( $variation ) ? $variation->ID : absint( $variation );
$final = '';
$output = '';
foreach ( $fieldss as $meta_id => $sections ) {
foreach ( $sections as $fields ) {
$errors = get_transient( '_wpsf_variation_' . $variation_id . '_' . $loop );
$options = get_post_meta( $variation_id, $meta_id, true );
$options = ( ! is_array( $options ) ) ? array() : $options;
if ( isset( $errors['errors'] ) ) {
$this->variation_errors = array_merge( $this->variation_errors, $errors['errors'] );
set_transient( '_wpsf_variation_' . $variation_id . '_' . $loop, array(), 10 );
}
wpsf_add_errors( $this->variation_errors );
foreach ( $fields['fields'] as $field ) {
if ( isset( $field['is_variation'] ) ) {
$field['is_variation'] = ( $field['is_variation'] === true ) ? 'default' : $field['is_variation'];
if ( $field['is_variation'] == $type ) {
$defaults = array(
'show' => '',
'hide' => '',
'wrap_class' => '',
);
$field = wp_parse_args( $field, $defaults );
$field['error_id'] = '_' . $loop . $field['error_id'];
$WrapClass = $this->show_hide_class( $field['show'], $field['hide'] );
$field['wrap_class'] = $this->_merge_wrap_class( $field['wrap_class'], $WrapClass );
$value = $this->get_field_values( $field, $options );
$output .= wpsf_add_element( $field, $value, $meta_id . '[' . $loop . ']' );
}
}
}
$defaults = array(
'show' => '',
'hide' => '',
);
$fields = wp_parse_args( $fields, $defaults );
$WrapClass = $this->show_hide_class( $fields['show'], $fields['hide'], 'string' );
$final .= '<div class="wpsf-wc-metabox-fields ' . $WrapClass . '">' . $output . '</div>';
}
}
return $final;
}
/**
* @param $variation_id
* @param $loop
*/
public function save_variation_fields( $variation_id, $loop ) {
if ( empty( $this->fields ) ) {
$this->handle_options();
}
$validator = new WPSFramework_DB_Save_Handler;
foreach ( $this->fields as $meta_id => $fields ) {
$posted_values = wpsf_get_var( $meta_id );
foreach ( $fields as $field ) {
if ( isset( $field['is_variation'] ) != false ) {
$field['error_id'] = '_' . $loop . $field['error_id'];
$val = isset( $posted_values[ $loop ][ $field['id'] ] ) ? $posted_values[ $loop ][ $field['id'] ] : "";
$val = $validator->_sanitize_field( $field, $val, $fields );
$val = $validator->_validate_field( $field, $val, $fields );
if ( isset( $posted_values[ $loop ][ $field['id'] ] ) ) {
$posted_values[ $loop ][ $field['id'] ] = $val;
}
}
}
update_post_meta( $variation_id, $meta_id, $posted_values[ $loop ] );
do_action( 'wpsf_wc_metabox_variation_saved', $variation_id, $meta_id, $posted_values[ $loop ], $loop );
set_transient( '_wpsf_variation_' . $variation_id . '_' . $loop, array( 'errors' => $validator->get_errors() ), 50 );
}
}
/**
* @param $option
* @param string $db_key
*
* @return string
*/
private function render_fields( $option, $db_key = '' ) {
global $post;
$html = '';
$values = get_post_meta( $post->ID, $db_key, true );
$transient = get_transient( 'wpsf-wc-mt' . $db_key );
$wpsf_errors = isset( $transient['errors'] ) ? $transient['errors'] : array();
wpsf_add_errors( $wpsf_errors );
if ( ! is_array( $values ) ) {
$values = array();
}
if ( isset( $option['fields'] ) ) {
foreach ( $option['fields'] as $field ) {
if ( isset( $field['is_variation'] ) && ( isset( $field['only_variation'] ) && $field['only_variation'] === true ) ) {
continue;
}
$defaults = array(
'show' => '',
'hide' => '',
'wrap_class' => '',
);
$field = wp_parse_args( $field, $defaults );
$WrapClass = $this->show_hide_class( $field['show'], $field['hide'] );
$field['wrap_class'] = $this->_merge_wrap_class( $field['wrap_class'], $WrapClass );
$value = $this->get_field_values( $field, $values );
$html .= wpsf_add_element( $field, $value, $db_key );
}
}
return $html;
}
/**
* @param string $key
*/
private function _render_group_page( $key = '' ) {
if ( ! isset( $this->group_fields[ $key ] ) ) {
return;
}
foreach ( $this->group_fields[ $key ] as $group_field ) {
$wc_class = ( isset( $group_field['wc_style'] ) && $group_field['wc_style'] === true ) ? ' wpsf-wc-style wpsf-wc-metabox-fields ' : ' wpsf-wc-metabox-fields ';
echo '<div class="' . $wc_class . '">';
echo $this->render_fields( $group_field, $group_field['id'] );
echo '</div>';
}
}
/**
* @param $section
* @param $db_id
* @param $section_variation
*/
private function _handle_fields( $section, $db_id, $section_variation ) {
$place = 'default';
$add_vars = false;
foreach ( $section['fields'] as $field_id => $field ) {
if ( $section_variation !== false ) {
$place = ( $section_variation === true ) ? 'default' : $section_variation;
$section['fields'][ $field_id ]['is_variation'] = $place;
$add_vars = true;
} elseif ( isset( $field['only_variation'] ) ) {
$place = ( $field['is_variation'] === true ) ? 'default' : $field['is_variation'];
$add_vars = true;
} else {
$this->fields[ $db_id ][] = $field;
if ( isset( $field['is_variation'] ) ) {
$place = ( $field['is_variation'] === true ) ? 'default' : $field['is_variation'];
$add_vars = true;
}
}
}
if ( $add_vars === true ) {
$this->variation_fields[ $place ][ $db_id ][] = $section;
}
}
/**
* @param $section
*
* @return null|string
*/
private function _get_page_id( $section ) {
$sec_id = ( isset( $section['id'] ) ) ? $section['id'] : null;
$sec_id = ( $sec_id === null && isset( $section['name'] ) ) ? wpsf_sanitize_title( $section['name'] ) : $sec_id;
$sec_id = ( $sec_id === null && isset( $section['group'] ) ) ? wpsf_sanitize_title( $section['group'] ) : $sec_id;
return $sec_id;
}
/**
* Handles Options array
*/
public function handle_options() {
foreach ( $this->options as $page_id => $page ) {
$sec_id = $this->_get_page_id( $page );
$page = $this->map_error_id( $page, $sec_id );
if ( isset( $page['sections'] ) ) {
foreach ( $page['sections'] as $section_id => $section ) {
$this->options[ $page_id ]['sections'][ $section_id ] = $section;
}
} else {
$this->options[ $page_id ] = $page;
}
}
foreach ( $this->options as $page_id => $page ) {
$db_id = $page['id'];
if ( ! isset( $this->fields[ $db_id ] ) ) {
$this->fields[ $db_id ] = array();
}
if ( isset( $page['sections'] ) ) {
foreach ( $page['sections'] as $section_id => $section ) {
$parent_variation = ( isset( $section['is_variation'] ) ) ? $section['is_variation'] : false;
$only_variation = ( isset( $section['only_variation'] ) ) ? $section['only_variation'] : false;
if ( $only_variation == false ) {
if ( isset( $section['group'] ) ) {
if ( ! isset( $this->group_fields[ $section['group'] ] ) ) {
$this->group_fields[ $section['group'] ] = array();
}
$this->group_fields[ $section['group'] ][] = array_merge( array( 'id' => $db_id ), $section );
} else {
$this->groups_to_add[] = array_merge( array( 'id' => $db_id ), $section );
}
}
$this->_handle_fields( $section, $db_id, $parent_variation );
}
} else {
$parent_variation = ( isset( $page['is_variation'] ) ) ? $page['is_variation'] : false;
$only_variation = ( isset( $page['only_variation'] ) ) ? $page['only_variation'] : false;
if ( $only_variation == false ) {
$this->groups_to_add[] = $page;
}
$this->_handle_fields( $page, $db_id, $parent_variation );
}
}
}
/**
* Saves product Data.
*/
public function save_product_data() {
global $post;
if ( wp_verify_nonce( wpsf_get_var( 'wpsf-framework-wc-metabox-nonce' ), 'wpsf-framework-wc-metabox' ) ) {
$validator = new WPSFramework_DB_Save_Handler;
foreach ( $this->fields as $db_id => $fields ) {
$transient = array();
$request = wpsf_get_var( $db_id );
$ex_value = $this->_post_data( 'get', $db_id );
$request = $validator->loop_fields( array( 'fields' => $fields ), $request, $ex_value );
$request = apply_filters( 'wpsf_wc_metabox_save', $request, $db_id, $post );
if ( empty( $request ) ) {
delete_post_meta( $post->ID, $db_id );
} else {
update_post_meta( $post->ID, $db_id, $request );
}
do_action( 'wpsf_wc_metabox_saved', $post->ID, $db_id, $request );
$transient['errors'] = $validator->get_errors();
set_transient( 'wpsf-wc-mt' . $db_id, $transient, 30 );
}
}
}
/**
* Loads required Styles & Scripts
*/
public function load_style_script() {
global $typenow;
if ( $typenow === 'product' ) {
wpsf_assets()->render_framework_style_scripts();
}
}
/**
* @param array $tabs
*
* @return array
*/
public function add_wc_tabs( $tabs = array() ) {
foreach ( $this->groups_to_add as $group ) {
$defaults = array(
'class' => array(),
'priority' => 9999,
'title' => '',
'name' => '',
'show' => '',
'hide' => '',
);
$group = wp_parse_args( $group, $defaults );
$default_class = array( 'wpsf-wc-tab' );
$default_class = is_array( $group['class'] ) ? array_merge( $group['class'], $default_class ) : array_merge( array( $group['class'] ), $default_class );
$default_class = array_merge( $default_class, $this->show_hide_class( $group['show'], $group['hide'] ) );
$tabs[ $group['name'] ] = array(
'label' => $group['title'],
'target' => apply_filters( 'wpsf_sanitize_title', 'wpsf_' . $group['name'] . '_wctab' ),
'class' => $default_class,
'priority' => $group['priority'],
);
}
return $tabs;
}
/**
* @param $data
* @param $key
*
* @return array
*/
private function __sh_class( $data, $key ) {
$return = array();
if ( ! empty( $data ) ) {
foreach ( explode( '|', $data ) as $c ) {
$return[] = $key . $c;
}
}
return $return;
}
/**
* @param string $show
* @param string $hide
* @param string $_r
*
* @return array|string
*/
private function show_hide_class( $show = '', $hide = '', $_r = 'array' ) {
$return = array();
$return = array_merge( $return, $this->__sh_class( $show, 'show_if_' ) );
$return = array_merge( $return, $this->__sh_class( $hide, 'hide_if_' ) );
if ( $_r == 'array' ) {
return $return;
}
return implode( ' ', $return );
}
/**
* @param string $old_classes
* @param array $new_class
*
* @return string
*/
private function _merge_wrap_class( $old_classes = '', $new_class = array() ) {
if ( empty( $old_class ) ) {
return implode( ' ', $new_class );
}
$ex_class = explode( ' ', $old_classes );
foreach ( $new_class as $c ) {
if ( ! in_array( $c, $ex_class ) ) {
$ex_class[] = $c;
}
}
return implode( ' ', $ex_class );
}
/**
* @param string $type
* @param string $key
* @param string $update_value
* @param string $post_id
*
* @return bool|int|mixed
*/
private function _post_data( $type = 'get', $key = '', $update_value = '', $post_id = '' ) {
if ( empty( $post_id ) ) {
global $post;
$post_id = isset( $post->ID ) ? $post->ID : false;
}
if ( $type == 'get' ) {
return get_post_meta( $post_id, apply_filters( 'wpsf_sanitize_title', $key ), true );
}
return update_post_meta( $post_id, apply_filters( 'wpsf_sanatize_title', $key ), $update_value );
}
/**
* Adds WC Fields.
*/
public function add_wc_fields() {
wp_nonce_field( 'wpsf-framework-wc-metabox', 'wpsf-framework-wc-metabox-nonce' );
foreach ( $this->groups_to_add as $group ) {
$default = array(
'fields' => '',
'name' => '',
'title' => '',
);
$group = wp_parse_args( $group, $default );
$id = apply_filters( 'wpsf_sanitize_title', 'wpsf_' . $group['name'] . '_wctab' );
$wc_class = ( isset( $group['wc_style'] ) && $group['wc_style'] === true ) ? ' wpsf-wc-style ' : '';
echo '<div id="' . $id . '" class="panel woocommerce_options_panel hidden wpsf-wc-metabox-fields' . $wc_class . '">';
echo $this->render_fields( $group, $group['id'] );
echo '</div>';
}
}
}
}