Extending WP_List_Table / handling checkbox options in plugin administration - wordpress

I'm working on a WordPress plugin, and part of that plugin requires extending WP_List_Table and storing any of the items which are checked in that table to an option. I've managed to figure out how to properly setup and display the required table, but how do I handle storing the checked options?
Here's what I've got so far...
class TDBar_List_Table extends WP_List_Table {
// Reference parent constructor
function __construct() {
global $status, $page;
// Set defaults
parent::__construct( array(
'singular' => 'theme',
'plural' => 'themes',
'ajax' => false
));
}
// Set table classes
function get_table_classes() {
return array('widefat', 'wp-list-table', 'themes');
}
// Setup default column
function column_default($item, $column_name) {
switch($column_name) {
case 'Title':
case 'URI':
case'Description':
return $item[$column_name];
default:
return print_r($item, true);
}
}
// Displaying checkboxes!
function column_cb($item) {
return sprintf(
'<input type="checkbox" name="%1$s" id="%2$s" value="checked" />',
//$this->_args['singular'],
$item['Stylesheet'] . '_status',
$item['Stylesheet'] . '_status'
);
}
// Display theme title
function column_title($item) {
return sprintf(
'<strong>%1$s</strong>',
$item['Title']
);
}
// Display theme preview
function column_preview($item) {
if (file_exists(get_theme_root() . '/' . $item['Stylesheet'] . '/screenshot.png')) {
$preview = get_theme_root_uri() . '/' . $item['Stylesheet'] . '/screenshot.png';
} else {
$preview = '';
}
return sprintf(
'<img src="%3$s" style="width: 150px;" />',
$preview,
$item['Title'],
$preview
);
}
// Display theme description
function column_description($item) {
if (isset($item['Version'])) {
$version = 'Version ' . $item['Version'];
if (isset($item['Author']) || isset($item['URI']))
$version .= ' | ';
} else {
$version = '';
}
if (isset($item['Author'])) {
$author = 'By ' . $item['Author'];
if (isset($item['URI']))
$author .= ' | ';
} else {
$author = '';
}
if (isset($item['URI'])) {
$uri = $item['URI'];
} else {
$uri = '';
}
return sprintf(
'<div class="theme-description"><p>%1$s</p></div><div class="second theme-version-author-uri">%2$s%3$s%4$s',
$item['Description'],
$version,
$author,
$uri
);
}
// Setup columns
function get_columns() {
$columns = array(
'cb' => '<input type="checkbox" />',
'title' => 'Theme',
'preview' => 'Preview',
'description' => 'Description'
);
return $columns;
}
// Make title column sortable
function get_sortable_columns() {
$sortable_columns = array(
'title' => array('Title', true)
);
return $sortable_columns;
}
// Setup bulk actions
function get_bulk_actions() {
$actions = array(
'update' => 'Update'
);
return $actions;
}
// Handle bulk actions
function process_bulk_action() {
// Define our data source
if (defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE == true) {
$themes = get_allowed_themes();
} else {
$themes = get_themes();
}
if ('update' === $this->current_action()) {
foreach ($themes as $theme) {
if ($theme['Stylesheet'] . '_status' == 'checked') {
// Do stuff - here's the problem
}
}
}
}
// Handle data preparation
function prepare_items() {
// How many records per page?
$per_page = 10;
// Define column headers
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
// Build the array
$this->_column_headers = array($columns, $hidden, $sortable);
// Pass off bulk action
$this->process_bulk_action();
// Define our data source
if (defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE == true) {
$themes = get_allowed_themes();
} else {
$themes = get_themes();
}
// Handle sorting
function usort_reorder($a,$b) {
$orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'Title';
$order = (!empty($_REQUEST['order'])) ? $_REQUEST['order'] : 'asc';
$result = strcmp($a[$orderby], $b[$orderby]);
return ($order === 'asc') ? $result : -$result;
}
usort($themes, 'usort_reorder');
//MAIN STUFF HERE
//for ($i = 0; i < count($themes); $i++) {
//}
// Figure out the current page and how many items there are
$current_page = $this->get_pagenum();
$total_items = count($themes);
// Only show the current page
$themes = array_slice($themes,(($current_page-1)*$per_page),$per_page);
// Display sorted data
$this->items = $themes;
// Register pagination options
$this->set_pagination_args( array(
'total_items' => $total_items,
'per_page' => $per_page,
'total_pages' => ceil($total_items/$per_page)
));
}
}
Problem is, I can't get it to save properly. I select the rows I want, hit save and it just resets.

I assume you are talking about the checkboxes in your table listing, so this will be how to process bulk actions.
All you need to do is add two new methods to your class and initialize it in the prepare_items method. I use the code below in one of my plugins to delete or export, but you can just as easily run an update.
/**
* Define our bulk actions
*
* #since 1.2
* #returns array() $actions Bulk actions
*/
function get_bulk_actions() {
$actions = array(
'delete' => __( 'Delete' , 'visual-form-builder'),
'export-all' => __( 'Export All' , 'visual-form-builder'),
'export-selected' => __( 'Export Selected' , 'visual-form-builder')
);
return $actions;
}
/**
* Process our bulk actions
*
* #since 1.2
*/
function process_bulk_action() {
$entry_id = ( is_array( $_REQUEST['entry'] ) ) ? $_REQUEST['entry'] : array( $_REQUEST['entry'] );
if ( 'delete' === $this->current_action() ) {
global $wpdb;
foreach ( $entry_id as $id ) {
$id = absint( $id );
$wpdb->query( "DELETE FROM $this->entries_table_name WHERE entries_id = $id" );
}
}
}
Now, call this method inside prepare_items() like so:
function prepare_items() {
//Do other stuff in here
/* Handle our bulk actions */
$this->process_bulk_action();
}
There's a fantastic helper plugin called Custom List Table Example that makes figuring out the WP_List_Table class much easier.

Related

Update post terms in each languages by code

who can hellp with this, i need create post from code, by wp_insert_post
function, so what is going on:
I creating post on each existing laguages, then i update all needed fields and i need to set post term depened of current language.
I have terms (shelters) https://prnt.sc/pklSXojB2jZj - i need that post set to current lang shelter while create, but after creating i got - https://prnt.sc/pz2jFEq1OAMP , 2 posts set in one lang terms. Maybe who know whats goes wrong, below i provided 2 functions who do these actions, Thanks in advance:
function add_pet($form_data, $ready_data, $update_meta = false) {
$allLang = pll_languages_list();
if ($allLang) {
$postsArr = array();
foreach ($allLang as $lang) {
//Add new pet
$post_id = wp_insert_post(array(
'post_title' => $form_data['pet_name'],
'post_status' => 'publish',
'post_author' => $form_data['user_id'],
'post_type' => 'pets',
));
//Check if post created, update all needed fields, and update post terms (shelter)
if ($post_id) {
//Get all translation of term
$shelter_id = pll_get_term(intval($form_data['shelter']), $lang);
$update_meta['shelter'] = $shelter_id;
//In this function we update those terms
$update_success = update_pets_fields($post_id, $ready_data, $update_meta);
$postsArr[$lang] = $post_id;
pll_set_post_language($post_id, $lang);
$postDate = get_post($post_id)->post_date;
$unixDate = strtotime($postDate);
update_post_meta($post_id, 'pet_update_date', $unixDate);
}
}
//Save post translation
if ($postsArr) {
pll_save_post_translations($postsArr);
}
//Old code
// foreach ($allLang as $lang) {
// $cat_id = pll_get_term(intval($form_data['kind_of_animal']), $lang);
// $shelter_id = pll_get_term(intval($form_data['shelter']), $lang);
// $post_id = $postsArr[$lang];
// $update_meta['post_category'] = $cat_id;
// $update_meta['shelter'] = $shelter_id;
// $update_success = update_pets_fields($post_id, $ready_data, $update_meta);
// }
}
if (is_wp_error($post_id)) {
wp_send_json_error($post_id->get_error_message());
}
if ($update_success) {
wp_send_json_success('Post was created.');
} else {
wp_send_json_error('Post was not created.');
}
}
And function who update field
/Update pets fields
function update_pets_fields($post_id, $data, $update_meta = false) {
if (!$post_id) return;
//Update post meta data not acf
if (isset($update_meta) && !empty($update_meta['title'])) {
$post_update = array(
'ID' => $post_id,
'post_title' => $update_meta['title']
);
$result = wp_update_post($post_update);
if (is_wp_error($result)) {
wp_send_json_error('Fields was not updated');
}
}
if (isset($update_meta['shelter']) && !empty($update_meta['shelter']) && intval($update_meta['shelter'])) {
wp_remove_object_terms($post_id, 'uncategorized', 'sholters');
$shelter_id = intval($update_meta['shelter']);
wp_set_post_terms($post_id, array($shelter_id), 'sholters');
if (is_wp_error($result)) {
wp_send_json_error('Term not updated');
}
}
if (isset($update_meta['post_category']) && !empty($update_meta['post_category']) && intval($update_meta['post_category'])) {
wp_remove_object_terms($post_id, 'uncategorized', 'category');
wp_set_post_categories($post_id, intval($update_meta['post_category']));
if (is_wp_error($result)) {
wp_send_json_error('Category not updated');
}
}
if (isset($update_meta['thumbnail']) && !empty($update_meta['thumbnail']) && intval($update_meta['thumbnail'])) {
set_post_thumbnail($post_id, intval($update_meta['thumbnail']));
}
if (is_null($data)) {
wp_send_json_error('No data.');
}
foreach ($data as $field) {
if ($field[3] === 'where_is') {
$field_array['field_62169d3cffb5b'] = array(
$field[2] => $field[1],
);
} else {
$field_array = array(
$field[2] => $field[1],
);
}
if (!empty($field[1])) {
$result = update_field('field_621696a7ffb4e', $field_array, $post_id);
}
}
if ($result) {
return false;
} else {
return true;
}
}
I try update it in diferent variants but it does't work, i check ids that come in args all ids is right and all posts ids is right.But on at the exit we got 2 posts in 1 term

How to do email validation by blocking some email domain names in wordpress?

I need to validate an email field in gravity form. We have some known list of email domains and need to validate whether that domains present or not and If that domains present means we need to show the error message.
What is the best way to implement that? Any plugin suggestions?
This is possible with the GW_Email_Domain_Validator snippet here:
https://gravitywiz.com/banlimit-email-domains-for-gravity-form-email-fields/
Full snippet as of July 18, 2020 included here. Use the link above to get the latest version.
<?php
/**
* Gravity Wiz // Gravity Forms // Email Domain Validator
*
* This snippets allows you to exclude a list of invalid domains or include a list of valid domains for your Gravity Form Email fields.
*
* #version 1.4
* #author David Smith <david#gravitywiz.com>
* #license GPL-2.0+
* #link http://gravitywiz.com/banlimit-email-domains-for-gravity-form-email-fields/
*/
class GW_Email_Domain_Validator {
private $_args;
function __construct($args) {
$this->_args = wp_parse_args( $args, array(
'form_id' => false,
'field_id' => false,
'domains' => false,
'validation_message' => __( 'Sorry, <strong>%s</strong> email accounts are not eligible for this form.' ),
'mode' => 'ban' // also accepts "limit"
) );
// convert field ID to an array for consistency, it can be passed as an array or a single ID
if($this->_args['field_id'] && !is_array($this->_args['field_id']))
$this->_args['field_id'] = array($this->_args['field_id']);
$form_filter = $this->_args['form_id'] ? "_{$this->_args['form_id']}" : '';
add_filter("gform_validation{$form_filter}", array($this, 'validate'));
}
function validate($validation_result) {
$form = $validation_result['form'];
foreach($form['fields'] as &$field) {
// if this is not an email field, skip
if(RGFormsModel::get_input_type($field) != 'email')
continue;
// if field ID was passed and current field is not in that array, skip
if($this->_args['field_id'] && !in_array($field['id'], $this->_args['field_id']))
continue;
$page_number = GFFormDisplay::get_source_page( $form['id'] );
if( $page_number > 0 && $field->pageNumber != $page_number ) {
continue;
}
if( GFFormsModel::is_field_hidden( $form, $field, array() ) ) {
continue;
}
$domain = $this->get_email_domain($field);
// if domain is valid OR if the email field is empty, skip
if($this->is_domain_valid($domain) || empty($domain))
continue;
$validation_result['is_valid'] = false;
$field['failed_validation'] = true;
$field['validation_message'] = sprintf($this->_args['validation_message'], $domain);
}
$validation_result['form'] = $form;
return $validation_result;
}
function get_email_domain( $field ) {
$email = explode( '#', rgpost( "input_{$field['id']}" ) );
return trim( rgar( $email, 1 ) );
}
function is_domain_valid( $domain ) {
$mode = $this->_args['mode'];
$domain = strtolower( $domain );
foreach( $this->_args['domains'] as $_domain ) {
$_domain = strtolower( $_domain );
$full_match = $domain == $_domain;
$suffix_match = strpos( $_domain, '.' ) === 0 && $this->str_ends_with( $domain, $_domain );
$has_match = $full_match || $suffix_match;
if( $mode == 'ban' && $has_match ) {
return false;
} else if( $mode == 'limit' && $has_match ) {
return true;
}
}
return $mode == 'limit' ? false : true;
}
function str_ends_with( $string, $text ) {
$length = strlen( $string );
$text_length = strlen( $text );
if( $text_length > $length ) {
return false;
}
return substr_compare( $string, $text, $length - $text_length, $text_length ) === 0;
}
}
To only accept submissions from a given email domain you can do something like this:
new GW_Email_Domain_Validator( array(
'form_id' => 326,
'field_id' => 1,
'domains' => array( 'gmail.com', 'hotmail.com', '.co.uk' ),
'validation_message' => __( 'Oh no! <strong>%s</strong> email accounts are not eligible for this form.' ),
'mode' => 'limit'
) );

How to create multiple blocks in Drupal 8

Hi I would like to create multiple blocks using the data rendered from variable table in Drupal 8.
I was able to achieve it in Drupal 7 but can't find a way to do the same in Drupal 8.
Can anyone suggest me a way to achieve this.
Code for Drupal 7 is as follows:
<?php
/**
* Create a block that will display the calendar feed
* Implements hook_block_info
*/
function my_module_block_info() {
$blocks = array();
$block_urls = variable_get('my_module_content');
$block_regions = variable_get('my_module_content_block_region');
$number_of_blocks = count($block_urls);
if ( $number_of_blocks > 0 ) {
foreach ( $block_urls as $key => $block_url ) {
$blocks['eventblock-' . $key] = array(
'info' => t('my_module_widget_block_' . $key),
'status' => TRUE,
'region' => $block_regions[$key],
'cache' => DRUPAL_NO_CACHE,
);
}
}
return $blocks;
}
/**
* Render the my_module block
* Implements hook_block_view
*/
function my_module_block_view($delta = '') {
$block = array();
$block_urls = variable_get('my_module_content' , array());
foreach ( $block_urls as $key => $block_url ) {
switch ($delta) {
case 'eventblock-' . $key:
$widgetURL= $block_urls[$key];
$block['content'] = my_module_content_generate($widgetURL); // Some function to generate block content.
break;
}
}
return $block;
}

How to run my class object with ajax jquery in PHP

I am developing a theme and currently working on import data process. Radium one click import working really fine for my but I want to add some minor change. I have two demos for my client, family law and personal law. I want to give her a choice so that she can install which one she wants in single install. Currently me demo was installed with button click, I just disabled that functionality by jquery e.perventDefault() function to check which button is clicked so that I can set my demo files accordingly.
Its working good and I am able to send my file names properly through ajax $_POST and getting those values in my PHP file.
The real issue is that it never imports my data any more. It sets my file names but does not start my import process. How can I start my import process again ?
Here is my code.
$('.import-process .import-start').click(function(e){
e.preventDefault();
alert('family-law');
$.ajax ({
type: "POST",
url:"path to my file",
data: "family=family",
success: function(data) {
console.log("message sent!");
alert(data);
}
});
});
With this data I am just getting my file names and nothing else at all. Now kindly let me know how can I start my import process either in PHP file or in js file I am totally no where by now. Thanks
Here is full code:
<?php
/**
* Class Radium_Theme_Importer
*
* This class provides the capability to import demo content as well as import widgets and WordPress menus
*
* #since 0.0.2
*
* #category RadiumFramework
* #package NewsCore WP
* #author Franklin M Gitonga
* #link http://radiumthemes.com/
*
*/
// Exit if accessed directly
if ( !defined( 'ABSPATH' ) ) exit;
// Don't duplicate me!
if ( !class_exists( 'Radium_Theme_Importer' ) ) {
class Radium_Theme_Importer {
public $theme_options_framework = 'radium'; //supports radium framework and option tree
public $theme_options_file;
public $widgets;
public $content_demo;
public $flag_as_imported = array( 'content' => false, 'menus' => false, 'options' => false, 'widgets' =>false );
public $imported_demos = array();
public $add_admin_menu = true;
private static $instance;
public function __construct() {
self::$instance = $this;
echo $this->demo_files_path = apply_filters('radium_theme_importer_demo_files_path', $this->demo_files_path);
if($this->me == 'kami'){
echo $this->theme_options_file = apply_filters('radium_theme_importer_theme_options_file', $this->demo_files_path . $this->theme_options_file_name);
} else {
echo $this->theme_options_file = apply_filters('radium_theme_importer_theme_options_file', $this->demo_files_path . $this->theme_options_file_name1);
}
echo $this->widgets = apply_filters('radium_theme_importer_widgets_file', $this->demo_files_path . $this->widgets_file_name);
$this->content_demo = apply_filters('radium_theme_importer_content_demo_file', $this->demo_files_path . $this->content_demo_file_name);
$this->imported_demos = get_option( 'radium_imported_demo' );
if( $this->theme_options_framework == 'optiontree' ) {
$this->theme_option_name = ot_options_id();
}
if( $this->add_admin_menu ) add_action( 'admin_menu', array($this, 'add_admin') );
add_filter( 'add_post_metadata', array( $this, 'check_previous_meta' ), 10, 5 );
add_action( 'radium_import_end', array( $this, 'after_wp_importer' ) );
}
public function add_admin() {
add_submenu_page('themes.php', "Import Demo Data", "Import Demo Data", 'switch_themes', 'radium_demo_installer', array($this, 'demo_installer'));
}
public function check_previous_meta( $continue, $post_id, $meta_key, $meta_value, $unique ) {
$old_value = get_metadata( 'post', $post_id, $meta_key );
if ( count( $old_value ) == 1 ) {
if ( $old_value[0] === $meta_value ) {
return false;
} elseif ( $old_value[0] !== $meta_value ) {
update_post_meta( $post_id, $meta_key, $meta_value );
return false;
}
}
}
public function after_wp_importer() {
do_action( 'radium_importer_after_content_import');
update_option( 'radium_imported_demo', $this->flag_as_imported );
}
public function intro_html() {
?>
<div style="background-color: #F5FAFD; margin:10px 0;padding: 5px 10px;color: #0C518F;border: 2px solid #CAE0F3; clear:both; width:90%; line-height:18px;">
<p class="tie_message_hint">Importing demo data (post, pages, images, theme settings, ...) is the easiest way to setup your theme. It will
allow you to quickly edit everything instead of creating content from scratch. When you import the data following things will happen:</p>
<ul style="padding-left: 20px;list-style-position: inside;list-style-type: square;}">
<li>No existing posts, pages, categories, images, custom post types or any other data will be deleted or modified .</li>
<li>No WordPress settings will be modified .</li>
<li>Posts, pages, some images, some widgets and menus will get imported .</li>
<li>Images will be downloaded from our server, these images are copyrighted and are for demo use only .</li>
<li>Please click import only once and wait, it can take a couple of minutes</li>
</ul>
</div>
<div style="background-color: #F5FAFD; margin:10px 0;padding: 5px 10px;color: #0C518F;border: 2px solid #CAE0F3; clear:both; width:90%; line-height:18px;"><p class="tie_message_hint">Before you begin, make sure all the required plugins are activated.</p></div>
<?php
if( !empty($this->imported_demos) ) { ?>
<div style="background-color: #FAFFFB; margin:10px 0;padding: 5px 10px;color: #8AB38A;border: 2px solid #a1d3a2; clear:both; width:90%; line-height:18px;">
<p><?php _e('Demo already imported', 'radium'); ?></p>
</div><?php
//return;
}
}
public function demo_installer() {
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
if( !empty($this->imported_demos ) ) {
$button_text = __('Import Again', 'radium');
} else {
$button_text = __('Import Demo Data', 'radium');
}
?><div id="icon-tools" class="icon32"><br></div>
<h2>Import Demo Data</h2>
<div class="radium-importer-wrap" data-demo-id="1" data-nonce="<?php echo wp_create_nonce('radium-demo-code'); ?>">
<form method="post">
<?php $this->intro_html(); ?>
<input type="hidden" name="demononce" value="<?php echo wp_create_nonce('radium-demo-code'); ?>" />
<input name="reset" class="panel-save button-primary radium-import-start" type="submit" value="<?php echo $button_text ; ?>" />
<input type="hidden" name="action" value="demo-data" />
<br />
<br />
<div class="radium-importer-message clear">
<?php if( 'demo-data' == $action && check_admin_referer('radium-demo-code' , 'demononce')){
$this->process_imports();
} ?>
</div>
</form>
</div>
<br />
<br /><?php
}
public function process_imports($mine = true, $content = true, $options = true, $widgets = true) {
if ( $content && !empty( $this->content_demo ) && is_file( $this->content_demo ) ) {
$this->set_demo_data( $this->content_demo );
}
if ( $options && !empty( $this->theme_options_file ) && is_file( $this->theme_options_file ) ) {
$this->set_demo_theme_options( $this->theme_options_file );
}
if ( $options ) {
$this->set_demo_menus();
}
if ( $widgets && !empty( $this->widgets ) && is_file( $this->widgets ) ) {
$this->process_widget_import_file( $this->widgets );
}
if($mine){
$this->import_options();
}
do_action( 'radium_import_end');
}
public function add_widget_to_sidebar($sidebar_slug, $widget_slug, $count_mod, $widget_settings = array()){
$sidebars_widgets = get_option('sidebars_widgets');
if(!isset($sidebars_widgets[$sidebar_slug]))
$sidebars_widgets[$sidebar_slug] = array('_multiwidget' => 1);
$newWidget = get_option('widget_'.$widget_slug);
if(!is_array($newWidget))
$newWidget = array();
$count = count($newWidget)+1+$count_mod;
$sidebars_widgets[$sidebar_slug][] = $widget_slug.'-'.$count;
$newWidget[$count] = $widget_settings;
update_option('sidebars_widgets', $sidebars_widgets);
update_option('widget_'.$widget_slug, $newWidget);
}
public function set_demo_data( $file ) {
if ( !defined('WP_LOAD_IMPORTERS') ) define('WP_LOAD_IMPORTERS', true);
require_once ABSPATH . 'wp-admin/includes/import.php';
$importer_error = false;
if ( !class_exists( 'WP_Importer' ) ) {
$class_wp_importer = ABSPATH . 'wp-admin/includes/class-wp-importer.php';
if ( file_exists( $class_wp_importer ) ){
require_once($class_wp_importer);
} else {
$importer_error = true;
}
}
if ( !class_exists( 'WP_Import' ) ) {
$class_wp_import = dirname( __FILE__ ) .'/wordpress-importer.php';
if ( file_exists( $class_wp_import ) )
require_once($class_wp_import);
else
$importer_error = true;
}
if($importer_error){
die("Error on import");
} else {
if(!is_file( $file )){
echo "The XML file containing the dummy content is not available or could not be read .. You might want to try to set the file permission to chmod 755.<br/>If this doesn't work please use the Wordpress importer and import the XML file (should be located in your download .zip: Sample Content folder) manually ";
} else {
$wp_import = new WP_Import();
$wp_import->fetch_attachments = true;
$wp_import->import( $file );
$this->flag_as_imported['content'] = true;
}
}
do_action( 'radium_importer_after_theme_content_import');
}
/** Import Options Hook added by kami*/
public function import_options() {
//$data = $_POST['data'];
$data = $options_export;
$data = base64_decode( $data );
$data = json_decode( $data, true );
if ( isset( $data ) ) {
foreach ( $data as $key => $value ) {
update_option( $key, wp_kses_post( stripcslashes( $value) ) );
}
}
//die();
}
/** import action ends **/
public function set_demo_menus() {}
public function set_demo_theme_options( $file ) {
// Does the File exist?
if ( file_exists( $file ) ) {
// Get file contents and decode
$data = file_get_contents( $file );
if( $this->theme_options_framework == 'radium') {
//radium framework
$data = unserialize( trim($data, '###') );
} elseif( $this->theme_options_framework == 'optiontree' ) {
//option tree import
$data = $this->optiontree_decode($data);
update_option( ot_options_id(), $data );
$this->flag_as_imported['options'] = true;
} else {
//other frameworks
//$data = json_decode( $data, true );
$data = maybe_unserialize( $data );
}
// Only if there is data
if ( !empty( $data ) || is_array( $data ) ) {
// Hook before import
$data = apply_filters( 'radium_theme_import_theme_options', $data );
update_option( $this->theme_option_name, $data );
$this->flag_as_imported['options'] = true;
}
do_action( 'radium_importer_after_theme_options_import', $this->demo_files_path );
} else {
wp_die(
__( 'Theme options Import file could not be found. Please try again.', 'radium' ),
'',
array( 'back_link' => true )
);
}
}
function available_widgets() {
global $wp_registered_widget_controls;
$widget_controls = $wp_registered_widget_controls;
$available_widgets = array();
foreach ( $widget_controls as $widget ) {
if ( ! empty( $widget['id_base'] ) && ! isset( $available_widgets[$widget['id_base']] ) ) { // no dupes
$available_widgets[$widget['id_base']]['id_base'] = $widget['id_base'];
$available_widgets[$widget['id_base']]['name'] = $widget['name'];
}
}
return apply_filters( 'radium_theme_import_widget_available_widgets', $available_widgets );
}
function process_widget_import_file( $file ) {
// File exists?
if ( ! file_exists( $file ) ) {
wp_die(
__( 'Widget Import file could not be found. Please try again.', 'radium' ),
'',
array( 'back_link' => true )
);
}
// Get file contents and decode
$data = file_get_contents( $file );
$data = json_decode( $data );
// Delete import file
//unlink( $file );
// Import the widget data
// Make results available for display on import/export page
$this->widget_import_results = $this->import_widgets( $data );
}
public function import_widgets( $data ) {
global $wp_registered_sidebars;
// Have valid data?
// If no data or could not decode
if ( empty( $data ) || ! is_object( $data ) ) {
return;
}
// Hook before import
$data = apply_filters( 'radium_theme_import_widget_data', $data );
// Get all available widgets site supports
$available_widgets = $this->available_widgets();
// Get all existing widget instances
$widget_instances = array();
foreach ( $available_widgets as $widget_data ) {
$widget_instances[$widget_data['id_base']] = get_option( 'widget_' . $widget_data['id_base'] );
}
// Begin results
$results = array();
// Loop import data's sidebars
foreach ( $data as $sidebar_id => $widgets ) {
// Skip inactive widgets
// (should not be in export file)
if ( 'wp_inactive_widgets' == $sidebar_id ) {
continue;
}
// Check if sidebar is available on this site
// Otherwise add widgets to inactive, and say so
if ( isset( $wp_registered_sidebars[$sidebar_id] ) ) {
$sidebar_available = true;
$use_sidebar_id = $sidebar_id;
$sidebar_message_type = 'success';
$sidebar_message = '';
} else {
$sidebar_available = false;
$use_sidebar_id = 'wp_inactive_widgets'; // add to inactive if sidebar does not exist in theme
$sidebar_message_type = 'error';
$sidebar_message = __( 'Sidebar does not exist in theme (using Inactive)', 'radium' );
}
// Result for sidebar
$results[$sidebar_id]['name'] = ! empty( $wp_registered_sidebars[$sidebar_id]['name'] ) ? $wp_registered_sidebars[$sidebar_id]['name'] : $sidebar_id; // sidebar name if theme supports it; otherwise ID
$results[$sidebar_id]['message_type'] = $sidebar_message_type;
$results[$sidebar_id]['message'] = $sidebar_message;
$results[$sidebar_id]['widgets'] = array();
// Loop widgets
foreach ( $widgets as $widget_instance_id => $widget ) {
$fail = false;
// Get id_base (remove -# from end) and instance ID number
$id_base = preg_replace( '/-[0-9]+$/', '', $widget_instance_id );
$instance_id_number = str_replace( $id_base . '-', '', $widget_instance_id );
// Does site support this widget?
if ( ! $fail && ! isset( $available_widgets[$id_base] ) ) {
$fail = true;
$widget_message_type = 'error';
$widget_message = __( 'Site does not support widget', 'radium' ); // explain why widget not imported
}
// Filter to modify settings before import
// Do before identical check because changes may make it identical to end result (such as URL replacements)
$widget = apply_filters( 'radium_theme_import_widget_settings', $widget );
// Does widget with identical settings already exist in same sidebar?
if ( ! $fail && isset( $widget_instances[$id_base] ) ) {
// Get existing widgets in this sidebar
$sidebars_widgets = get_option( 'sidebars_widgets' );
$sidebar_widgets = isset( $sidebars_widgets[$use_sidebar_id] ) ? $sidebars_widgets[$use_sidebar_id] : array(); // check Inactive if that's where will go
// Loop widgets with ID base
$single_widget_instances = ! empty( $widget_instances[$id_base] ) ? $widget_instances[$id_base] : array();
foreach ( $single_widget_instances as $check_id => $check_widget ) {
// Is widget in same sidebar and has identical settings?
if ( in_array( "$id_base-$check_id", $sidebar_widgets ) && (array) $widget == $check_widget ) {
$fail = true;
$widget_message_type = 'warning';
$widget_message = __( 'Widget already exists', 'radium' ); // explain why widget not imported
break;
}
}
}
// No failure
if ( ! $fail ) {
// Add widget instance
$single_widget_instances = get_option( 'widget_' . $id_base ); // all instances for that widget ID base, get fresh every time
$single_widget_instances = ! empty( $single_widget_instances ) ? $single_widget_instances : array( '_multiwidget' => 1 ); // start fresh if have to
$single_widget_instances[] = (array) $widget; // add it
// Get the key it was given
end( $single_widget_instances );
$new_instance_id_number = key( $single_widget_instances );
// If key is 0, make it 1
// When 0, an issue can occur where adding a widget causes data from other widget to load, and the widget doesn't stick (reload wipes it)
if ( '0' === strval( $new_instance_id_number ) ) {
$new_instance_id_number = 1;
$single_widget_instances[$new_instance_id_number] = $single_widget_instances[0];
unset( $single_widget_instances[0] );
}
// Move _multiwidget to end of array for uniformity
if ( isset( $single_widget_instances['_multiwidget'] ) ) {
$multiwidget = $single_widget_instances['_multiwidget'];
unset( $single_widget_instances['_multiwidget'] );
$single_widget_instances['_multiwidget'] = $multiwidget;
}
// Update option with new widget
update_option( 'widget_' . $id_base, $single_widget_instances );
// Assign widget instance to sidebar
$sidebars_widgets = get_option( 'sidebars_widgets' ); // which sidebars have which widgets, get fresh every time
$new_instance_id = $id_base . '-' . $new_instance_id_number; // use ID number from new widget instance
$sidebars_widgets[$use_sidebar_id][] = $new_instance_id; // add new instance to sidebar
update_option( 'sidebars_widgets', $sidebars_widgets ); // save the amended data
// Success message
if ( $sidebar_available ) {
$widget_message_type = 'success';
$widget_message = __( 'Imported', 'radium' );
} else {
$widget_message_type = 'warning';
$widget_message = __( 'Imported to Inactive', 'radium' );
}
}
// Result for widget instance
$results[$sidebar_id]['widgets'][$widget_instance_id]['name'] = isset( $available_widgets[$id_base]['name'] ) ? $available_widgets[$id_base]['name'] : $id_base; // widget name or ID if name not available (not supported by site)
$results[$sidebar_id]['widgets'][$widget_instance_id]['title'] = $widget->title ? $widget->title : __( 'No Title', 'radium' ); // show "No Title" if widget instance is untitled
$results[$sidebar_id]['widgets'][$widget_instance_id]['message_type'] = $widget_message_type;
$results[$sidebar_id]['widgets'][$widget_instance_id]['message'] = $widget_message;
}
}
$this->flag_as_imported['widgets'] = true;
// Hook after import
do_action( 'radium_theme_import_widget_after_import' );
// Return results
return apply_filters( 'radium_theme_import_widget_results', $results );
}
public function optiontree_decode( $value ) {
$func = 'base64' . '_decode';
$prepared_data = maybe_unserialize( $func( $value ) );
return $prepared_data;
}
}//class
}//function_exists
?>
Here is my INIT class
<?php
if($_POST){
$theHash = $_POST['hashString'];
echo $theHash; echo "the hash value is";
}
/**
* Version 0.0.3
*
* This file is just an example you can copy it to your theme and modify it to fit your own needs.
* Watch the paths though.
*/
// Exit if accessed directly
if ( !defined( 'ABSPATH' ) ) exit;
// Don't duplicate me!
if ( !class_exists( 'Radium_Theme_Demo_Data_Importer' ) ) {
require_once( dirname( __FILE__ ) . '/importer/radium-importer.php' ); //load admin theme data importer
class Radium_Theme_Demo_Data_Importer extends Radium_Theme_Importer {
/**
* Set framewok
*
* options that can be used are 'default', 'radium' or 'optiontree'
*
* #since 0.0.3
*
* #var string
*/
public $theme_options_framework = 'radium';
public $me = 'dani';
/**
* Holds a copy of the object for easy reference.
*
* #since 0.0.1
*
* #var object
*/
private static $instance;
/**
* Set the key to be used to store theme options
*
* #since 0.0.2
*
* #var string
*/
public $theme_option_name = 'my_theme_options_name'; //set theme options name here (key used to save theme options). Optiontree option name will be set automatically
/**
* Set name of the theme options file
*
* #since 0.0.2
*
* #var string
*/
public $theme_options_file_name = 'theme_options.txt';
public $theme_options_file_name1 = 'theme_options1.txt';
/**
* Set name of the widgets json file
*
* #since 0.0.2
*
* #var string
*/
public $widgets_file_name = 'widgets.json';
/**
* Set name of the content file
*
* #since 0.0.2
*
* #var string
*/
public $content_demo_file_name = 'content.xml';
/**
* Holds a copy of the widget settings
*
* #since 0.0.2
*
* #var string
*/
public $widget_import_results;
/**
* Constructor. Hooks all interactions to initialize the class.
*
* #since 0.0.1
*/
public function __construct() {
$this->demo_files_path = dirname(__FILE__) . '/demo-files/'; //can
self::$instance = $this;
parent::__construct();
}
/**
* Add menus - the menus listed here largely depend on the ones registered in the theme
*
* #since 0.0.1
*/
public function set_demo_menus(){
// Menus to Import and assign - you can remove or add as many as you want
$top_menu = get_term_by('name', 'Top Menu', 'nav_menu');
$main_menu = get_term_by('name', 'Main Menu', 'nav_menu');
$footer_menu = get_term_by('name', 'Main Menu', 'nav_menu');
set_theme_mod( 'nav_menu_locations', array(
'top-menu' => $top_menu->term_id,
'primary' => $main_menu->term_id,
'footer-menu' => $footer_menu->term_id
)
);
$this->flag_as_imported['menus'] = true;
}
}
new Radium_Theme_Demo_Data_Importer;
}
Now here is my question again ... How can I extend this code so that I can import data based on my selection. For that I can send that selection by ajax post as well. Thanks hope that's enough info by now.

Wordpress validation for title

Need to add blank and already exist validation for 'supports' => array( 'title') on my custom post type. But i dont want to use any plugin for this.
Thanks in advance.
add_action( 'admin_notices', 'custom_error_notice' );
function custom_error_notice(){
global $current_screen, $post;
if ( $current_screen->parent_base == 'edit' ){
if((!$post->post_name) && $_GET['post']) {
wp_redirect(admin_url('post-new.php?empty=1'));
}
if($_GET['empty']) echo '<div class="error"><p>Warning - Please fill up all fields correctly!</p></div>';
}
}
But this not working properly.
This may help you:-
add_action('save_post', 'album_save_post', 10, 2);
function album_save_post( $album_id, $album ) {
if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE || $album->post_type != 'music_album') return;
// echo '<pre>';
// print_r($album);
// echo '</pre>';
// die();
$errors = array();
// Validation filters
$title = $album->post_title;
if ( ! $title ) {
$errors['title'] = "The title is required";
}
// if we have errors lets setup some messages
if (! empty($errors)) {
// we must remove this action or it will loop for ever
remove_action('save_post', 'album_save_post');
// save the errors as option
update_option('album_errors', $errors);
// Change post from published to draft
$album->post_status = 'draft';
// update the post
wp_update_post( $album );
// we must add back this action
add_action('save_post', 'album_save_post');
// admin_notice is create by a $_GET['message'] with a number that wordpress uses to
// display the admin message so we will add a filter for replacing default admin message with a redirect
add_filter( 'redirect_post_location', 'album_post_redirect_filter' );
}
}
function album_post_redirect_filter( $location ) {
// remove $_GET['message']
$location = remove_query_arg( 'message', $location );
// add our new query sting
$location = add_query_arg( 'album', 'error', $location );
// return the location query string
return $location;
}
// Add new admin message
add_action( 'admin_notices', 'album_post_error_admin_message' );
function album_post_error_admin_message() {
if ( isset( $_GET['album'] ) && $_GET['album'] == 'error' ) {
// lets get the errors from the option album_errors
$errors = get_option('album_errors');
// now delete the option album errors
delete_option('album_errors');
$display = '<div id="notice" class="error"><ul>';
// Because we are storing as an array we should loop through them
foreach ( $errors as $error ) {
$display .= '<li>' . $error . '</li>';
}
$display .= '</ul></div>';
// finally echo out our display
echo $display;
// add some jQuery
?>
<script>
jQuery(function($) {
$("#title").css({"border": "1px solid red"})
});
</script>
<?php
}
}
i got the solution.
/** ADD Validation for title */
function force_post_title_init()
{
wp_enqueue_script('jquery');
}
function force_post_title()
{
echo "<script type='text/javascript'>\n";
echo "
jQuery('#publish').click(function(){
var testervar = jQuery('[id^=\"titlediv\"]')
.find('#title');
if (testervar.val().length < 1)
{
jQuery('[id^=\"titlediv\"]').css('border', '1px solid red');
alert('Post title is required');
return false;
}
});
";
echo "</script>\n";
}
add_action('admin_init', 'force_post_title_init');
add_action('edit_form_advanced', 'force_post_title');
// Add this row below to get the same functionality for page creations.
add_action('edit_page_form', 'force_post_title');
May be this also help for all of you.

Resources