/home/moonrcjl/public_html/test/wp-content/plugins/pure-metafields/metaboxes/class-metabox.php
<?php
/**
* Register a meta box using a class.
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
class tpmeta_meta_box {
private static $instance = false;
/**
* Constructor.
*/
public function __construct() {
if ( is_admin() ) {
add_action( 'load-post.php', array( $this, 'tpmeta_init_metabox' ) );
add_action( 'load-post-new.php', array( $this, 'tpmeta_init_metabox' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'tpmeta_load_metabox_scripts' ));
/**
* Option For user meta
*/
add_action('show_user_profile', array( $this, 'tpmeta_add_user_metafields' ));
add_action('edit_user_profile', array( $this, 'tpmeta_add_user_metafields' ));
add_action('personal_options_update', array( $this, 'tpmeta_save_user_metafields' ));
add_action('edit_user_profile_update', array( $this, 'tpmeta_save_user_metafields' ));
add_filter('manage_users_columns', array( $this, 'tpmeta_add_field_in_admin_table'));
add_filter('manage_users_custom_column', array( $this, 'tpmeta_user_field_admin_table_values'), 10, 3);
}
}
/**
* Load css and js
*/
public function tpmeta_load_metabox_scripts(){
// css
wp_enqueue_style( 'wp-color-picker');
wp_enqueue_style( 'jquery-ui', TPMETA_URL . 'metaboxes/css/jquery-ui.min.css', array(), time(), 'all');
wp_enqueue_style( 'select2', TPMETA_URL . 'metaboxes/css/select2.min.css', array(), time(), 'all');
wp_enqueue_style( 'dragula', TPMETA_URL . 'metaboxes/css/dragula.min.css', array(), time(), 'all');
wp_enqueue_style( 'tm-metabox-css', TPMETA_URL . 'metaboxes/css/puremeta-style.css', array(), time(), 'all');
//js
wp_enqueue_script( 'select2', TPMETA_URL . 'metaboxes/js/select2.min.js', array('jquery'), time(), true);
wp_enqueue_script( 'dragula', TPMETA_URL . 'metaboxes/js/dragula.min.js', array('jquery'), time(), true);
wp_enqueue_script( 'wp-color-picker');
wp_enqueue_script( 'tm-metabox-js', TPMETA_URL . 'metaboxes/js/main.js', array('jquery', 'jquery-ui-datepicker'), time(), true);
wp_register_script( 'repeater', TPMETA_URL . 'metaboxes/js/repeater.js', array('jquery', 'jquery-ui-datepicker', 'dragula'), time(), true);
wp_enqueue_media();
}
/**
* Meta box initialization.
*/
public function tpmeta_init_metabox() {
add_action( 'add_meta_boxes', array( $this, 'tpmeta_add_metabox' ) );
add_action( 'save_post', array( $this, 'tpmeta_save_metabox' ), 10, 2 );
}
/**
* Adds the meta box.
*/
public function tpmeta_add_metabox() {
$metaboxs = apply_filters('tp_meta_boxes', array());
if(!empty($metaboxs)){
foreach($metaboxs as $metabox){
$_post_format = get_post_format();
if( isset($metabox['post_format']) ){
if($_post_format == $metabox['post_format']){
$this->tpmeta_metabox_action($metabox, "remove");
}else{
$this->tpmeta_metabox_action($metabox);
}
}
add_meta_box(
$metabox['metabox_id'],
$metabox['title'],
array($this, 'tpmeta_metabox_render'),
$metabox['post_type'],
$metabox['context'],
$metabox['priority'],
array('meta' => $metabox)
);
}
}
}
/**
* Hide Metabox
*/
public function tpmeta_metabox_action( $metabox, $action = NULL ){
$screen_id = get_current_screen()->id;
$user_id = get_current_user_id();
$defaults = array(
'postexcerpt',
'trackbacksdiv',
'postcustom',
'commentstatusdiv',
'commentsdiv',
'slugdiv',
'authordiv',
);
$closed_meta_boxes = get_user_meta($user_id, 'metaboxhidden_' . $screen_id, true);
if($action == "remove"){
if(empty($closed_meta_boxes)){
return;
}
$search = array_search($metabox['metabox_id'], $closed_meta_boxes);
if( !is_bool($search) && $search >= 0){
unset($closed_meta_boxes[$search]);
}
update_user_meta($user_id, 'metaboxhidden_' . $screen_id, $closed_meta_boxes);
}else{
if( empty($closed_meta_boxes) ){
$defaults[] = $metabox['metabox_id'];
update_user_meta($user_id, 'metaboxhidden_' . $screen_id, $defaults);
}else{
$search = array_search($metabox['metabox_id'], $closed_meta_boxes);
if(is_bool($search) && $search == false ){
$closed_meta_boxes[] = $metabox['metabox_id'];
update_user_meta($user_id, 'metaboxhidden_' . $screen_id, $closed_meta_boxes);
}else{
update_user_meta($user_id, 'metaboxhidden_' . $screen_id, $closed_meta_boxes);
}
}
}
}
/**
* Metabox HTML Render Funtion
*/
public function tpmeta_metabox_render($post, $metabox){
// Enqueue wp-api and wp-editor first
wp_enqueue_script( 'wp-api' );
wp_enqueue_script( 'wp-editor' );
$meta = $metabox['args']['meta'];
$columns = isset($meta['columns'])? $meta['columns'] : 3;
$_post_format = isset($meta['post_format'])? sanitize_text_field( wp_unslash($meta['post_format']) ) : '';
$_metabox_id = isset($meta['metabox_id'])? sanitize_text_field( wp_unslash($meta['metabox_id']) ) : '';
?>
<div
data-metabox-id="<?php echo esc_attr($_metabox_id); ?>"
data-post-format="<?php echo esc_attr($_post_format); ?>"
class="tm-meta-wrapper tm-meta-column-<?php echo esc_attr($columns); ?>">
<?php wp_nonce_field( "_nonce_action_tp_metabox", "_nonce_tp_metabox" ); ?>
<input type="hidden" name="current_metabox_id[]" value="<?php echo esc_attr($meta['metabox_id']); ?>">
<?php
foreach($meta['fields'] as $field){
tpmeta_load_template('metaboxes/fields/group.php', array(
'field' => $field,
'fields' => $meta['fields'],
'post' => $post
));
}
?>
</div>
<?php
}
/**
* Handles saving the meta box.
*
* @param int $post_id Post ID.
* @param WP_Post $post Post object.
* @return null
*/
public function tpmeta_save_metabox( $post_id, $post ) {
// Add nonce for security and authentication.
$metaboxes = apply_filters('tp_meta_boxes', array());
// check if empty
if(!isset($_POST['_nonce_tp_metabox'])){
return;
}
// Check if nonce is valid.
if ( !wp_verify_nonce( $_POST['_nonce_tp_metabox'], '_nonce_action_tp_metabox' ) ) {
return;
}
// Check if user has permissions to save data.
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
// Check if not an autosave.
if ( wp_is_post_autosave( $post_id ) ) {
return;
}
// Check if not a revision.
if ( wp_is_post_revision( $post_id ) ) {
return;
}
$current_meta = array_filter($metaboxes, function($item){
if( is_array($_POST['current_metabox_id']) ){
if(in_array($item['metabox_id'], $_POST['current_metabox_id'])){
return $item;
}
}else{
return $item['metabox_id'] == $_POST['current_metabox_id'];
}
});
$current_metas = array_values($current_meta);
$types = array('text', 'image', 'gallery', 'colorpicker', 'tabs', 'datepicker', 'select_posts');
foreach($current_metas as $meta){
$fields = $meta['fields'];
foreach($fields as $field){
if(in_array($field['type'], $types) && !empty($_POST[$field['id']])){
update_post_meta($post_id, $field['id'], sanitize_text_field($_POST[$field['id']]));
}elseif($field['type'] == 'checkbox'){
if(!empty($field['options'])){
$options = array();
foreach($field['options'] as $key => $val){
if(!empty($_POST[$field['id'].'_'.$key])){
$options[$key] = sanitize_text_field($val);
}
}
update_post_meta($post_id, $field['id'], $options);
}
}elseif($field['type'] == 'textarea' && !empty($_POST[$field['id']])){
// Define allowed SVG tags and attributes
$allowed_tags = tpmeta_allowed_svg_tags();
if(is_array($_POST[$field['id']])){
return;
}
update_post_meta($post_id, $field['id'], wp_kses($_POST[$field['id']], $allowed_tags));
}elseif($field['type'] == 'select'){
if(isset($_POST[$field['id']]) && isset($field['multiple']) && $field['multiple'] == true){
$array_object = array();
foreach($field['options'] as $key => $val){
if(in_array($key, $_POST[$field['id']])){
$array_object[$key] = $val;
}
}
update_post_meta($post_id, $field['id'], self::sanitize_array(!isset($_POST[$field['id']])? array() : $array_object));
}else{
$array_object = array();
if(isset($field['value']) && $field['value'] == 'both'){
foreach($field['options'] as $key => $val){
if($key == $_POST[$field['id']]){
$array_object[$key] = $val;
}
}
update_post_meta($post_id, $field['id'], self::sanitize_array(!isset($_POST[$field['id']])? array() : $array_object));
}else{
update_post_meta($post_id, $field['id'], sanitize_text_field(!isset($_POST[$field['id']])? '' : $_POST[$field['id']]));
}
}
}elseif($field['type'] == 'repeater' && isset($_POST[$field['id']]) ){
$_meta_key = $field['id'];
$_row_counter = isset($_POST[$field['id'].'_counter'])? intval($_POST[$field['id'].'_counter']) : 0;
$_repeater_rows = self::sanitize_array($_POST[$field['id']]);
// var_dump($_repeater_rows);
$_repeater_rows_value = array();
if($_row_counter > 0){
for($i=0; $i<count($_repeater_rows); $i++){
$_row = array();
foreach( $field['fields'] as $repeater_field ){
$_get_field_value = self::sanitize_array($_POST[$repeater_field['id']]);
if(in_array($repeater_field['type'], $types) && !empty($repeater_field)){
$_row[$repeater_field['id']] = sanitize_text_field($_get_field_value[$i]);
}elseif($repeater_field['type'] == 'textarea' && !empty($repeater_field)){
$_row[$repeater_field['id']] = sanitize_textarea_field($_get_field_value[$i]);
}elseif($repeater_field['type'] == 'checkbox' && !empty($repeater_field)){
$_row[$repeater_field['id']] = self::sanitize_array(json_decode(stripslashes($_get_field_value[$i]), true));
}elseif($repeater_field['type'] == 'select' && !empty($repeater_field)){
$array_object = [];
$array_object[$_get_field_value[$i]] = $repeater_field['options'][$_get_field_value[$i]];
$_row[$repeater_field['id']] = self::sanitize_array($array_object);
}else{
$_row[$repeater_field['id']] = sanitize_text_field($_get_field_value[$i]);
}
}
$_repeater_rows_value[] = $_row;
}
}
update_post_meta($post_id, $_meta_key, $_repeater_rows_value);
}else{
if(isset($_POST[$field['id']])){
update_post_meta($post_id, $field['id'], sanitize_text_field($_POST[$field['id']]));
}else{
update_post_meta($post_id, $field['id'], sanitize_text_field('off'));
}
}
}
}
}
/**
* Add User Extra Fields
*/
public function tpmeta_add_user_metafields($user){
$get_metas_from_filter = apply_filters('tp_user_meta', array());
if(empty($get_metas_from_filter)){
return;
}
?>
<?php wp_nonce_field( "_nonce_action_tp_user_meta", "_nonce_tp_user_meta" ); ?>
<h2><?php echo esc_html($get_metas_from_filter['label']); ?></h2>
<hr/>
<table class="form-table">
<?php
foreach($get_metas_from_filter['fields'] as $field){
$new_field = wp_parse_args(array('user_id' => $user->ID), $field);
tpmeta_load_template('metaboxes/user-fields/'.$field['type'].'.php', $new_field);
}
?>
</table>
<?php
}
public function tpmeta_save_user_metafields($user){
// Add nonce for security and authentication.
$user_metas = apply_filters('tp_user_meta', array());
// check if empty
if(!isset($_POST['_nonce_tp_user_meta'])){
return;
}
// Check if nonce is valid.
if ( !wp_verify_nonce( $_POST['_nonce_tp_user_meta'], '_nonce_action_tp_user_meta' ) ) {
return;
}
// Check if user has permissions to save data.
if ( ! current_user_can( 'edit_user', $user ) ) {
return;
}
foreach($user_metas['fields'] as $field){
if(isset($_POST[$field['id']])){
update_user_meta($user, $field['id'], sanitize_text_field($_POST[$field['id']]));
}else{
update_user_meta($user, $field['id'], 'off');
}
}
}
public function tpmeta_add_field_in_admin_table($column){
$user_metas = apply_filters('tp_user_meta', array());
if(!empty($user_metas)){
foreach($user_metas['fields'] as $field){
if(isset($field['show_in_admin_table']) && $field['show_in_admin_table'] == 1){
$column[$field['id']] = $field['label'];
}
}
return $column;
}else{
return $column;
}
}
public function tpmeta_user_field_admin_table_values($value, $column, $user_id){
$user_metas = apply_filters('tp_user_meta', array());
if(!empty($user_metas)){
foreach($user_metas['fields'] as $field){
if(isset($field['show_in_admin_table']) && $field['show_in_admin_table'] == 1 && $field['id'] == $column){
if($field['type'] == 'image'){
$user_image_url = get_user_meta( $user_id, $field['id'], true );
if(!empty($user_image_url)){
$image_output = '<div class="tp-user-image"><img src="'.esc_url($user_image_url).'" alt=""/></div>';
return $image_output;
}
}else{
return get_user_meta( $user_id, $field['id'], true );
}
}
}
return $value;
}
}
public static function sanitize_array($arr){
$sanitized_arr = array();
if(is_array($arr)){
if(!empty($arr)){
foreach($arr as $key => $val){
$sanitized_arr[$key] = sanitize_text_field($val);
}
return $sanitized_arr;
}else{
return $arr;
}
}else{
return sanitize_text_field($arr);
}
}
public static function instance(){
if(!self::$instance){
self::$instance = new self();
}
return self::$instance;
}
}
new tpmeta_meta_box();