Tag: Wordpress

WordPress wp_nav_menu() add new custom sub menu item

If some time we need to add new menu item in drop down list. bellow code to we can add sub menu.

See demo image


function dalwadiwp_submenu_item($items, $args) {

$theme_location = 'main-menu';// Theme Location slug
## if ( $args->theme_location == 'main-menu' ) // if we can set menu location then used it.
if ( $args->menu == 19 ) // if we can not set menu location then used direct menu id.
{
// debug($items);
$existing_menu_item_db_id = 701;
$new_menu_item_db_id = 98987; // unique id number
$label = 'Log out';
$url = wp_logout_url(get_permalink());

if ( is_user_logged_in() ) {

// only if user is logged-in, do sub-menu link
$item = array(
'title' => $label,
'menu_item_parent' => $existing_menu_item_db_id,
'ID' => 'log-out',
'db_id' => $new_menu_item_db_id,
'url' => $url,
// 'classes' => array( 'custom-menu-item' )// optionally add custom CSS class
);

$items[] = (object) $item;
}
}
return $items;
}

add_filter('wp_nav_menu_objects', 'dalwadiwp_submenu_item',10 , 2);

 

WordPress remove plugin deactivate link(option) from admin


add_filter( 'plugin_action_links', 'disable_plugin_deactivation', 10, 4 );
function disable_plugin_deactivation( $actions, $plugin_file, $plugin_data, $context ) {


// Remove edit link for all
if ( array_key_exists( 'edit', $actions ) )
unset( $actions['edit'] );


// Remove deactivate link for crucial plugins
if ( array_key_exists( 'deactivate', $actions ) && in_array( $plugin_file, array(
'woocommerce/woocommerce.php',
'contact-form-7/wp-contact-form-7.php'
)))
unset( $actions['deactivate'] );
return $actions;
}

Call jQuery function after all image are load

Some time we need to set equal height in our design. using below snippet we can easily call function or custom code.


// =============================================
// load portfolio list
// =============================================
function load_portfolio_list( post_length ) {

var category_id = jQuery(".portfolio-list").data('category_id');
jQuery( '.portfolio-ajax' ).addClass('loading');
jQuery.ajax({
type: "POST",
url: adminurl,
dataType: 'json',
data: { action : 'load_portfolio', post_length : post_length, category_id : category_id},
success: function (result){
jQuery('.portfolio-list .portfolio-ajax').remove();
jQuery('.portfolio-list .row').append(result.portfolio_list).imagesLoaded().then(function(){
equalheight('.portfilio-item');
});
},
error:function(){
alert("Error: There is some issue please try again.");
},
beforeSend:function(){
jQuery( '.portfolio-ajax' ).addClass('loading');
},
complete: function () {
jQuery( '.portfolio-ajax' ).removeClass('loading');
// Our code after load
}
});
}

below code are check image are loading after done function will return


// Fn to allow an event to fire after all images are loaded
jQuery.fn.imagesLoaded = function ($) {

// get all the images (excluding those with no src attribute)
var $imgs = this.find('img[src!=""]');
// if there's no images, just return an already resolved promise
if (!$imgs.length) {return jQuery.Deferred().resolve().promise();}

// for each image, add a deferred object to the array which resolves when the image is loaded (or if loading fails)
var dfds = [];
$imgs.each(function(){

var dfd = jQuery.Deferred();
dfds.push(dfd);
var img = new Image();
img.onload = function(){dfd.resolve();}
img.onerror = function(){dfd.resolve();}
img.src = this.src;

});

// return a master promise object which will resolve when all the deferred objects have resolved
// IE - when all the images are loaded
return jQuery.when.apply(jQuery,dfds);

}

WordPress file protected with user login

Some time we deed to give option to user download PDF, Doc file the protected with user login

On Download action code as like below


foreach($download_list as $list) {
$title = $list['title'];
$download = $list['download']['url'];

$path = get_home_url().'/';
$dir = '';
$resource_src = str_replace($path, $dir, $download);
$data = base64_encode($resource_src.'^'.get_current_user_id());

$url = get_site_url()."/download.php?file=$data";
?>
<li><a href="<?php echo $url; ?>" target="_blank"><?php echo $title; ?></a></li>
<?php
}

Create “download.php” file from root and add below code.


include('wp-load.php');

if( !get_current_user_id() )
{
wp_redirect(site_url('login/'));
exit;
}
$rew = explode('^',base64_decode($_GET['file']));
if($rew[1] != get_current_user_id())
{
wp_redirect(site_url('login/'));
exit;
}
$file = $rew[0];
$all = $_GET['all'];
if(isset($all)) {
if(json_decode($all)) {
$allFiles = json_decode($all);
} else {
$allFiles = explode(',',$all);

}

$zipname = 'images-'.date('YmdHis').'.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);

foreach ($allFiles as $imgfile) {
$path_parts = pathinfo($imgfile);
$ext = strtolower($path_parts["extension"]);
if($ext != 'php') {
$zip->addFile($imgfile, basename($imgfile));
}
}
$zip->close();
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=$zipname");
header("Pragma: no-cache");
header("Expires: 0");

readfile($zipname);
unlink($zipname);
}
if(isset($file)) {
download_file($file);
}
function download_file( $fullPath ){

// Must be fresh start
if( headers_sent() )
die('Headers Sent');

// Required for some browsers
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');

// File Exists?
if( file_exists($fullPath) ){

// Parse Info / Get Extension
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);

// Determine Content Type
switch ($ext) {
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}

if($ext != 'php') {
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$fsize);
ob_clean();
flush();
readfile( $fullPath );
} else
die('Invalid File');

} else
die('File Not Found');

}

Good Plug in list for normal WordPress website

For create option in admin page and post
https://github.com/wp-premium/advanced-custom-fields-pro

Regenerate image size
https://wordpress.org/support/plugin/ajax-thumbnail-rebuild/

Autoptimize css and JS file
https://wordpress.org/plugins/autoptimize/

Category and taxonomy reorder
https://wordpress.org/plugins/taxonomy-terms-order/

Custom Post Order
https://wordpress.org/plugins/simple-custom-post-order/
Security
https://wordpress.org/plugins/better-wp-security/
WooCommerce PDF Invoices & Packing Slips
https://wordpress.org/plugins/woocommerce-pdf-invoices-packing-slips/
check cron job schedule
https://wordpress.org/plugins/wp-crontrol/
WP-Mail-SMTP
https://wordpress.org/plugins/wp-mail-smtp/

Set Columns
https://wordpress.org/support/plugin/genesis-easy-columns/reviews/

Stripe payment gateway

https://wordpress.org/plugins/woocommerce-gateway-stripe/

Contact Form DB

https://cfdbplugin.com/

Custom Featured Image Metabox

 

Duplicate Post

https://wordpress.org/plugins/duplicate-post/

SendGrid

https://wordpress.org/plugins/sendgrid-email-delivery-simplified/

The Events Calendar

https://wordpress.org/plugins/the-events-calendar/

W3 Total Cache

https://wordpress.org/plugins/w3-total-cache/

WordPress seo

https://wordpress.org/plugins/wordpress-seo/

YITH WooCommerce Mailchimp

https://wordpress.org/plugins/yith-woocommerce-mailchimp/

WordPress WooCommerce import product with CSV file

When we need to import product data using this script easily add or modified existing product data. also we can download last uploaded CSV file.

add_action( 'admin_menu', 'product_data_admin_menu' );
function product_data_admin_menu() {
	add_submenu_page( 'edit.php?post_type=product','Product import', 'Product import', 'manage_options', 'product_import', 'product_import_admin_section', 'dashicons-analytics', 58  );
}


function product_import_admin_section(){

?>

<div class="wrap parents_import">
	<h2>Product CSV Import</h2>
	<?php 
	
	global $wpdb,$post;
	
	$date = get_option('last_product_import_time');	

	$old_date_timestamp = strtotime($date);
	$new_date = date('Y-m-d h:i', $old_date_timestamp);
	$csv_name = get_option('last_product_import_file');
	
	if(!empty($csv_name)):
		echo '<p>You can <a href="'.get_template_directory_uri().'/csv/'.$csv_name.'" target="_blank" class="blue"><strong>download last upload file </strong></a> for reference.</p>';
		echo '<p> Last uploaded date is '.$new_date.' </p>';
	endif;	

	?>



	<form action="" method="post" id="prodcut_import" enctype="multipart/form-data">	
		<div class="fileUpload ">
			<span>Upload</span>
			<input id="uploadBtn" name="uploadfile" type="file" class="upload" />
		</div>
		<input type="submit" name="submit" class="button button-primary imp-submit-btn" value="Submit">			
		</form>
	</div>

	<?php
	
	
if (isset($_POST['submit'])){
		set_time_limit(0); 
		error_reporting(E_ERROR | E_WARNING | E_PARSE);
		
		if ($_FILES['uploadfile']['size'] != 0)
		{
			
		global $wpdb,$post;
		$filename = $_FILES['uploadfile']['name'];
		$allowed =  array('csv');
		$filename = $_FILES['uploadfile']['name'];
		$fileTmp_name = $_FILES['uploadfile']['tmp_name'];
		$fileData = file($fileTmp_name);
		$user_count = count($fileData);
		$ext = pathinfo($filename, PATHINFO_EXTENSION);
		if(in_array($ext,$allowed) ) {
			
			
			$taxonomy = 'product_cat';
			$taxonomy_brand = 'brand';
			$user_id  = 1;		

			$row = 0;
			$errorData = array();
			$countusers = array();
			if (($handle = fopen($fileTmp_name, "r")) !== FALSE) {
			while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
						
				if($row == 0){ 
					$row++; continue;
				}
				$data = array_map("utf8_encode", $data );
				
				$SKU 				= $data[0]; # Item SKU
				$post_thumb 		= $data[1];	# Product Image
				$post_title 		= $data[2];	# Product Name
				$content 			= $data[3];	# Long Product Description
				$post_content		= (!empty($content)) ? $content : '';
				$price	 			= str_replace('$', '', $data[4]);	#Price
				$price				= preg_replace("/[^0-9\.]/", '', $price);
				$category   		= ucfirst($data[5]);	#Product Category
				$qty   				= $data[6];		#Quantity On Hand
				$stock_status			= ($qty > 0 ) ? 'instock' : 'outofstock';		#Out of Stock / In Stock
				
				$product_slider_temp	= (!empty($data[12]) ? $data[12].',':'');	#Main Image URL
				$product_slider_temp1	= $data[13];	#Product Gallery URL(s)
				
				$product_slider		= $product_slider_temp.$product_slider_temp1;
				$brand	= ucfirst($data[14]);	#Brand
				
				$distributor_a = array('regular_price'=>$distributor_discount_a,'selling_price'=>'');
				$distributor_b = array('regular_price'=>$distributor_discount_b,'selling_price'=>'');
				$distributor_c = array('regular_price'=>$distributor_discount_c,'selling_price'=>'');
				
				
				$SKUD = wc_get_product_id_by_sku($SKU);
				if($SKUD == 0){
					$my_post = array(
						'post_author' 	=> $user_id,
						'post_title'    => $post_title,
						'post_name'     => $post_title,
						'post_content'  => '',
						'post_status'   => 'publish',
						'post_type'     => 'product'
					);
								
					$lastPostid = wp_insert_post( $my_post, $wp_error );
					$ID = $lastPostid;
					if(!empty($post_thumb)){
						Generate_Featured_Image($post_thumb, $ID);
					}
					update_post_meta( $ID, '_visibility', 'visible' );
					update_post_meta( $ID, '_wpr_cp', 'no' );
					update_post_meta( $ID, '_edit_last', 1 );
					update_post_meta( $ID, '_downloadable', 'no' );
					update_post_meta( $ID, 'total_sales', 0 );
					update_post_meta( $ID, '_virtual', 'no' );
					update_post_meta( $ID, '_purchase_note', '' );
					update_post_meta( $ID, '_featured', 'no' );
					update_post_meta( $ID, '_weight', '' );
					update_post_meta( $ID, '_length', '' );
					update_post_meta( $ID, '_width', '' );
					update_post_meta( $ID, '_height', '' );
					update_post_meta( $ID, '_product_attributes', 'a:0:{}' );
					update_post_meta( $ID, '_sale_price_dates_from', '' );
					update_post_meta( $ID, '_sold_individually', '' );
					update_post_meta( $ID, '_manage_stock', 'yes' );
					update_post_meta( $ID, '_backorders', 'no' );
					update_post_meta( $ID, '_upsell_ids', 'a:0:{}' );
					update_post_meta( $ID, '_crosssell_ids', 'a:0:{}' );
					update_post_meta( $ID, '_product_version', '2.5.6' );
					update_post_meta( $ID, '_product_image_gallery', '' ); 
					
					if(!empty($category)){
						wp_set_object_terms( $ID, $category, $taxonomy, true );	
					}
					
					
					if(!empty($price)){
						update_post_meta( $ID, '_price', $price );
						update_post_meta( $ID, '_regular_price', $price  );		 
					}
					
					if(!empty($qty)){
						update_post_meta( $ID, '_stock', $qty  );
					}
					if(!empty($stock_status)){
						update_post_meta( $ID, '_stock_status', $stock_status  );
					}
					
					if(!empty($SKU)){
						update_post_meta( $ID, '_sku', $SKU  );
					}
					
					if(!empty($brand)){
						wp_set_object_terms( $ID, $brand, $taxonomy_brand, true );	
					}						
					
				}
				else{
					$SID = $SKUD;		
					$my_post = array(
						'ID'           => $SID,
						'post_title'    => $post_title,
						'post_name'     => $post_title,
						'post_content'  => '',
						'post_status'   => 'publish',
						'post_type'     => 'product'
					);
							
					$lastPostid = wp_insert_post( $my_post, $wp_error );
					
					if(!empty($post_thumb)){
						Generate_Featured_Image($post_thumb,$SID);
					}
					if(!empty($category)){
						wp_set_object_terms( $SID, $category, $taxonomy, true );	
					}
					
					if(!empty($price)){
						update_post_meta( $SID, '_price', $price );
						update_post_meta( $SID, '_regular_price', $price  );		 
					}
					
					if(!empty($qty)){
						update_post_meta( $SID, '_stock', $qty  );
					}
					if(!empty($stock_status)){
						update_post_meta( $SID, '_stock_status', $stock_status  );
					}
					
					
					if(!empty($brand)){
						wp_set_object_terms( $SID, $brand, $taxonomy_brand, true );	
					}
				}	
			}	## while end		
			fclose($handle);
			} 	## if (($handle = fopen($fileTmp_name, "r")) !== FALSE) {
			
	
		
		  
			  
	   echo '<div class="notice notice-success is-dismissible">';
	   echo '<p><strong>Import data successfully.</strong></p>';
	   echo '</div>';
			
		$CurrentDate = date('j-m-y-h-i');
		$CurrentDateSave = date('Y-m-d h:i');
		$newname = "product_date-".$CurrentDate.".".$ext; 
		$target = get_template_directory().'/csv/'.$newname;
		
		if (!file_exists(get_template_directory().'/csv/')) {
			mkdir(get_template_directory().'/csv/', 0777, true);
		}
		move_uploaded_file($_FILES['uploadfile']['tmp_name'],$target);
		
		add_option( 'last_product_import_file', $newname, '', 'yes' );
		add_option( 'last_product_import_time', $CurrentDateSave, '', 'yes' );

		}
		else{
			echo '<div class="notice notice-warning is-dismissible">';
			echo '<p><strong>Please upload csv file only.</strong></p>';
			echo '</div>';
		}
		
	} // Empty check
	else{
			echo '<div class="notice notice-warning is-dismissible">';
			echo '<p><strong>Please upload file.</strong></p>';
			echo '</div>';
		}
	}// upload action
}

Add a media image and featured image from a URL

When we import data than mostly need to dynamically add a featured image or custom post type from another domain than we need to add image in media with featured image.


// Call Function with value
Generate_Featured_Image('https://dummyimage.com/vga', 7);


function Generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if(wp_mkdir_p($upload_dir['path']))     $file = $upload_dir['path'] . '/' . $filename;
    else                                    $file = $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

WordPress search in custom post meta

Searching in custom post meta as like WooCommerce SKU.

add_filter( 'posts_where', 'codyfy_search_where' );
function codyfy_search_where( $where ){
    global $pagenow, $wpdb;
    $class_status = $_GET['s'] ? $_GET['s'] : ''; 
    if ($_GET['s'] != '') {
        $where = preg_replace(
       "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
       "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_key LIKE '_sku' AND ".$wpdb->postmeta.".meta_value LIKE $1) ", $where );
    }
	
    return $where;
}

add_filter('posts_join', 'codyfy_search_join' );
function codyfy_search_join ($join){
    global $pagenow, $wpdb;
    if ( $_GET['s'] != '') {    
        $join .='LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
    return $join;
}
WordPress li nav menu set in 2 columns

WordPress li nav menu set in 2 columns

We can customized wp_nav_menu using walker class.

below snippet to set menu in 2 columns. Add in functions.php file.


class DW_Walker_Nav_Menu extends Walker_Nav_Menu {

var $current_menu = null;
var $break_point = null;

function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {

global $wp_query;

if( !isset( $this->current_menu ) )
$this->current_menu = wp_get_nav_menu_object( $args->menu );

if( !isset( $this->break_point ) )
$this->break_point = ceil( $this->current_menu->count / 2 ) + 1;

$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

$class_names = $value = '';

$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = 'menu-item-' . $item->ID;

$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
$class_names = ' class="' . esc_attr( $class_names ) . '"';

$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
$id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';

if( $this->break_point == $item->menu_order )
$output .= $indent . '</li></ul><ul><li' . $id . $value . $class_names .'>';
else
$output .= $indent . '<li' . $id . $value . $class_names .'>';

$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';

$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;

$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}

Lastly, you’ll also need to set you wp_nav_menu call to use a custom walker, which also means you’ll need to pass the args as an array, here’s an example.


wp_nav_menu( array(
'menu' => 'your-menu-id',
'walker' => new DW_Walker_Nav_Menu
) );