Category: wordpress

How to enqueue javascript files properly in the WordPress admin panel

You’d probably have answered the question already, won’t you? We all know that the correct answer is to do that we have to write a function that hooks the “admin_enqueue_scripts” and inside that function we will have to load the script via wp_enqueue_scripts() function. That’s the correct answer, but when it comes to the best practices, it fails. Because when you’re loading a javascript file blindly in all pages, it can be messy and it also may conflict with other scripts which are already loaded in that page. Besides that, why load an extra script everywhere when you actually need it in a specific page, or two perhaps.

The correct, or “precise” way to enqueue a javascript file in the WordPress admin panel is to check first which page you’re on. And when you’re on that specific page where this javascript file is actually required, load it. So how you’re gonna check which page you’re on in the admin panel? The enqueue hook passes a parameter that tells you about this. Let’s have a look at the following example

[sourcecode language=”php”]
add_action("admin_enqueue_scripts","admin_scripts_loader");

function admin_scripts_loader(){
wp_enqueue_script("myscript","path/to/my/script.js");
}
[/sourcecode]

There is nothing wrong with the enqueueing system above. However, the only problem is that it will load your script in every admin page, you need it or not. So let’s write a better version of that admin_scripts_loader function.

[sourcecode language=”php”]
function admin_scripts_loader($hook){
if(in_array($hook,array("post-new.php","post.php","edit.php"))) {
//specifically load this javascript in post editor pages
wp_enqueue_script("myscript", "path/to/my/script.js");
}
}
[/sourcecode]

Now the code is more accurately loading your javascript file only in the post editor pages. This $hook variable gives you the name of the PHP file that you’re on. So it’s quite easy for you to figure out where you should load it.

Hope you enjoyed it.

Fetch WordPress media files using BackboneJS

WordPress uses BackboneJS and Underscores in the admin panel. Though codex has a rich set of documentation on different WordPress topics, it lacks instructions of using these BackboneJS models in your code. So here’s a small snippet which shows you how to fetch an attachment from your WordPress blog using these models

First of all, you will have to enqueue media scripts via wp_enqueue_scripts or admin_enqueue_scripts hook. This will load all the necessary media js scripts needed for this task.

[sourcecode language=”php”]
wp_enqueue_media();
[/sourcecode]

And then, from your front end code you can access the attachments like this

https://gist.github.com/hasinhayder/eb62a4c02bf4134f5939

Hope you liked it 🙂

ReduxFramework – a perfect example of how not to redesign your site!

This is not a rant. It’s a post from a fan who is sad, very sad.

I am a fan of Redux Framework and use it in all my themes. It’s easy to use and it has an excellent collection of controls which can make your life easier when you deal with option panels. However, the documentation SUCKS!!! It SUCKS big time. Not because it lacks necessary information, but because how it gives you the exact feeling of finding a needle in the haystack. If you go to their documentation, you will literally feel lost. Why not try to search the documentation of “color” control, or “text” perhaps”.

It was a lot easier to find the required information when they were using github wiki. But now, with the redesign, it’s very tough.  Their search doesn’t work as expected, gives you a lot of unnecessary information that you don’t need.

And oh, the funny thing is that in the WHOLE site, their github repository is not linked (as of the time of writing it). You simply can’t find a “DOWNLOAD” button, not even something that takes you to the original ReduxFramework repo! Heh, I submitted a ticket in their issue tracker and Dovy replied that he will take care of it. Maybe he is too busy to add a link in 3 months!

So go to ReduxFramework site, and scream “Where is the Mothe*fuck*ng  download/fork link?”. No one will hear your scream, boy, no one. They are too busy in making PAID extensions.

I love ReduxFramework. I don’t like how it gives a negative impression from the website. I really don’t like that.

 

কিভাবে ওয়ার্ডপ্রেসে নিজের থিমে রিডাক্স ফ্রেমওয়ার্ক যোগ করব?

Screen Shot 2014-07-16 at 10.14.36 PM
ওয়ার্ডপ্রেসের যতগুলো অ্যাডমিন প্যানেল বা অপশন ফ্রেমওয়ার্ক আছে তাদের মাঝে রিডাক্স অন্যতম। অনেকগুলো চমৎকার ফিচার, প্রচুর ফিল্ডের সমারোহ এবং সহজ ব্যবহারোপযোগিতার কারনে রিডাক্স খুব দ্রুতই ওয়ার্ডপ্রেস থিম ডেভেলপার দের দৃষ্টি আকর্ষন করতে সক্ষম হয়েছে। এছাড়াও রিডাক্সে ডেভেলপাররা ক্রমাগত এটাকে আপডেট করে চলেছেন, যার ফলে আমরা মাঝেমাঝেই পাচ্ছি নিত্য নতুন ফিচার। আজকের এই আর্টিকেলে আমি দেখাবো কিভাবে আমরা আমাদের থিমে এই রিডাক্স ফ্রেমওয়ার্ক দিয়ে তৈরী অপশন প্যানেল যোগ করব

১. এজন্য প্রথমেই https://github.com/ReduxFramework/ReduxFramework/ এখানে ডানদিকের নিচে গিয়ে “Download zip” বাটনে ক্লিক করে রিডাক্স ফ্রেমওয়ার্ক ডাউনলোড করে নিন

২. ডাউনলোড করা জিপ ফাইলটি আনজিপ/এক্সট্রাক্ট করলে redux-framework-master নামে একটা ফোল্ডার পাবেন। সেটা ওপেন করে একমাত্র ReduxCore এবং sample নামের ফোল্ডার দুটো রাখুন, আর class.redux-plugin.php, index.php, license.txt, redux-framework.php নামের ফাইলগুলো রেখে বাকি সবকিছু ডিলেট করে দিন। ডিলেট করার পরে redux-framework-master ফোল্ডার এর কনটেন্ট হবে নিচের মত

Screen Shot 2014-07-16 at 9.47.41 PM

৩. এবার আপনার থিমে libs নামে একটা ডিরেক্টরী তৈরী করে তার ভেতরে এই redux-framework-master ফোল্ডার পেস্ট করে দিন।

৪. এবার আপনার থিমের functions.php ফাইলে নিচের কোড টুকু যোগ করুন

if(!class_exists("ReduxFrameworkPlugin")){
    require_once(get_template_directory()."/libs/redux-framework-master/redux-framework.php");
    require_once(get_template_directory()."/libs/redux-framework-master/sample/sample-config.php");
}

৫. এবার আপনার থিম অ্যাক্টিভেট করে ওয়ার্ডপ্রেস এর অ্যাডমিন প্যানেলে আসলেই বামপাশে দেখবেন “Sample Options” নামে একটা মেনু চলে এসেছে, যা আসলে রিডাক্সের স্যাম্পল ফাইল টির আউটপুট।

Screen Shot 2014-07-16 at 9.58.57 PM

ব্যাস, আমাদের থিমে রিডাক্স ফ্রেমওয়ার্ক যোগ করা শেষ। একদম সহজ, তাই না? এখন আপনি sample-config.php ফাইলটি স্টাডি করে দেখতে পারেন কিভাবে বিভিন্ন ধরনের ফিল্ড যোগ করা হয়েছে। লাইন নম্বর ২৩৯ থেকে এই সেকশন এবং ফিল্ড গুলোর ডেফিনিশন শুরু হয়েছে। এখন একটা বিষয় খুবই জরুরী, আর সেটা হল এই যে আমাদের থিমের ইউজার রা রিডাক্সের সাহায্যে বিভিন্ন ডেটা ইনপুট দিবে – আমরা সেগুলো থিমে ব্যবহার করব কিভাবে। এর জন্য আমাদের দেখতে হবে ১৫৩৫ নম্বর লাইনে (বর্তমান আপডেট অনুযায়ী) এই লাইনটি আছে

'opt_name'          => 'redux_demo',

এখানে আপনি আপনার পছন্দ মতো ভ্যারিয়েবলের নাম লিখতে পারবেন। যেমন আপনার থিমের নাম যদি হয় FlyHigh তাহলে আপনি লিখতে পারেন

'opt_name'          => 'flyhigh',

এটা করা হয়ে গেলে আপনার থিমের ফাইলে সবার উপরে এই লাইনটি লিখবেন

global $flyhigh;

এর পর থেকে রিডাক্সের যেকোন ফিল্ডের ডেটা আপনি অ্যাক্সেস করতে পারবেন $flyhigh[‘fieldid’] এইভাবে। ফিল্ডের আইডি কিভাবে লিখতে হয় এটা জানতে হলে আপনি স্যাম্পল কনফিগ ফাইলে অনেক উদাহরণ পাবেন, যেমন ধরুন একটা ফিল্ডের ডেফিনিশন হল

array(
    'id'        =>  'my_text_field',
    'type'      =>  'text',
    'desc'      =>  'Add some awesome text here',
    'default'   =>  'Oh WOW!',
    'title'     =>  'My Awesome Text'

),

উপরের উদাহরণে ফিল্ডের আইডি হল my_text_field। আরেকটা জিনিশ, সেটা হল যে “Sample Options” নামের মেনুর নাম পরিবর্তন করতে চাইলে নিচের লাইনটি খুঁজে বের করে আপনার পছন্দ মত মেনু নাম দিন

'menu_title'        => __('Sample Options', 'redux-framework-demo'),

এই স্যাম্পল ফাইলটি আপনার জানার সুবিধার্থে রিডাক্স টিম করে দিয়েছে। এই ফাইলে পরিবর্তন না করে বরং একই ফোল্ডারে দেখবেন barebones-config.php নামে আরেকটা ফাইল রয়েছে, যেটাতে শুধু যেটুকু দরকার সেটুকুই কোড আছে। আপনি সেই ফাইলটি আপনার থিমের কোথাও কপি করে নিয়ে আপনার থিমের জন্য নিজের মত করে অ্যাডমিন প্যানেল বানাতে পারবেন।

আশাকরি আর্টিকেলটি আপনাদের ভালো লেগেছে। তারপরেও মন্তব্যে জানালে খুশি হব 🙂

থিমফরেস্টে ওয়ার্ডপ্রেস থিম পাবলিশ করার আগে একটা প্রয়োজনীয় চেকলিস্ট

checklist

অনেক কষ্ট করে এবং সময় ব্যয় করে একটা ওয়ার্ডপ্রেস থিম তৈরী করে তারপর হার্ড রিজেক্ট বা একের পর এক সফট রিজেক্ট খেলে দেখা যায় অনেকেই কনফিডেন্স হারিয়ে ফেলেন। তাদের জন্য আজকে আমার ছোট্ট এই চেকলিস্ট যাতেকরে প্রয়োজনীয় কাজগুলো আগেই ঠিকমত করে রাখতে পারেন এবং রিজেকশনের সম্ভাবনাও কমিয়ে ফেলতে পারেন

১. ভ্যালিড মার্কআপ লিখুন। মার্কআপ যদি ব্রোকেন হয় তাহলে সেটা রিজেক্ট খাওয়ার সম্ভাবনা শতকরা ৯৯ ভাগ
২. ডিজাইনে বৈচিত্র আনতে হবে এমন কোন কথা নেই, জাস্ট আপনার কাজ যেন সব ব্রাউজারে ঠিক মত চলে সেদিকে লক্ষ্য রাখুন।
৩. টাইপোগ্রাফি এবং কনটেন্টের বিন্যাস খুবই প্রয়োজনীয় একটা বিষয়। এই বিষয়ে অভিজ্ঞ হবার জন্য নতুন বা অ্যাপ্রুভ হওয়া থিমগুলো বেশী করে দেখুন। খুব বেশী এলিমেন্ট দেয়ার চেয়ে বরং আকর্ষনীয় ভাবে উপস্থাপন করাটা বেশী জরুরী (more…)

SupportX – A rich support app-theme for Envato Authors built using WordPress

01_supportx_preview.__large_preview (1)
Last week, we have developed SupportX, a beautiful support theme based on WordPress. SupportX is built specially for the Envato marketplace authors where it’s a tedious job to provide proper support to the buyers of their product. It comes with a handful of useful features like SMS notification, live notification feed, purchase code verification and Knowledge base, and it doesn’t require to install external plugins like bbPress to use SupportX.

For $45, I must say that it’s a real bargain. You can purchase SupportX from Themeforest by going to this link http://bit.ly/1o90Wvc

WordPress Plugin Boilerplate Code Generator from Tom Mcfarlin's Plugin Boilerplate

Tom Mcfarlin has written an excellent boilerplate for plugin developers. It is very easy to start writing your own plugins using his boilerplate. But if you want to personalize it to YourPluginName, you will have to modify all these files and replace hardcoded variables and class names which is a real pain in the ass.

So I have created a code generator which takes Tom Mcfarlin’s repository and replace everything (wherever necessary) by your plugin name, author name etc and personalize it so that you can download and start using it right away.

Check out this code generator at http://codegen.kickapz.com

You can download the source code of this code generator at https://github.com/hasinhayder/plugin-boilerplate-code-generator

Writing a new plugin is now painless 🙂

How to create a page and assign a page template automatically in WordPress

Sometime your theme depends on a few special pages, and it’s better to create them automatically after theme activation. You could also ask your users to create these pages and assign a few specific page template, but why would you do that if there is a scope of doing it automatically from your theme. Here is a simple snippet to take care of that 🙂

Step 1: Create a page template in your theme (say awesome-page.php) which has the following code
[sourcecode language=”php”]
<?php
/**
* Template Name: Awesome Page
*/
[/sourcecode]

Step 2: Add the following code in your theme’s functions.php file 🙂

[sourcecode language=”php”]
add_action(‘after_setup_theme’, ‘create_pages’);
function create_pages(){
$awesome_page_id = get_option("awesome_page_id");
if (!$awesome_page_id) {
//create a new page and automatically assign the page template
$post1 = array(
‘post_title’ => "Awesome Page!",
‘post_content’ => "",
‘post_status’ => "publish",
‘post_type’ => ‘page’,
);
$postID = wp_insert_post($post1, $error);
update_post_meta($postID, "_wp_page_template", "awesome-page.php");
update_option("awesome_page_id", $postID);
}
}
[/sourcecode]

And you are done!

Get a list of Top 10 authors in a WordPress blog, and sort them by firstname and last name

Getting top 10 authors’s list from WordPress is actually pretty simple with a SELECT query. Here is the SQL for that which sorts the list by number of posts of each authors
[sourcecode language=”sql”]
SELECT wp_users.id,
display_name,
user_login,
user_nicename,
count(wp_posts.id) AS number_of_posts
FROM wp_users
JOIN wp_posts
ON wp_posts.post_author = wp_users.id
GROUP BY wp_posts.post_author
ORDER BY number_of_posts DESC
LIMIT 10
[/sourcecode]

And sorting this list by first name is pretty simple as well
[sourcecode language=”sql”]
SELECT *
FROM (SELECT wp_users.id,
display_name,
user_login,
user_nicename,
count(wp_posts.id) AS number_of_posts
FROM wp_users
JOIN wp_posts
ON wp_posts.post_author = wp_users.id
GROUP BY wp_posts.post_author
ORDER BY number_of_posts DESC
LIMIT 10) AS SortedByCount
ORDER BY display_name
[/sourcecode]

However, sorting that list by Lastname is a little tricky, we need to take extra care for display_name and extract the last name from it.
[sourcecode language=”sql”]
SELECT *
FROM (SELECT wp_users.id,
display_name,
user_login,
user_nicename,
count(wp_posts.id) AS number_of_posts,
substring_index(display_name, ‘ ‘, -1) AS lastname
FROM wp_users
JOIN wp_posts
ON wp_posts.post_author = wp_users.id
GROUP BY wp_posts.post_author
ORDER BY number_of_posts DESC
LIMIT 10) AS SortedByCount
ORDER BY lastname
[/sourcecode]

Now all you need to do is run it like this
[sourcecode language=”php”]
$top_authors = $wpdb->get_results($sql, ARRAY_A);
[/sourcecode]

Sweet, eh?

Improving UX in the WordPress Admin Panel with Interactive Meta Boxes

Our goal is simple today, we want to add interactivity to our boring metaboxes. Instead of showing lots and lots of irrelevant input boxes at once, we will properly group them into different metaboxe containers and then display the required one based on the action of another one.

We will create a custom post called “profession”, then we will let our user choose from two pre defined professions, for example “photographer” and “programmer”. Based on his choice we will display another set of metaboxes to get the details of that profession.

Step 1: Register the custom post
Here is a simple custom post register script, add the following snippet in your functions.php

[sourcecode language=”php”]
add_action( ‘init’, ‘mytheme_custom_post_profession’ );
function mytheme_custom_post_profession() {

$labels = array(
‘name’ => _x( ‘Professions’, ‘profession’ ),
‘singular_name’ => _x( ‘Profession’, ‘profession’ ),
‘add_new’ => _x( ‘Add New’, ‘profession’ ),
‘all_items’ => _x( ‘Professions’, ‘profession’ ),
‘add_new_item’ => _x( ‘Add New Profession’, ‘profession’ ),
‘edit_item’ => _x( ‘Edit Profession’, ‘profession’ ),
‘new_item’ => _x( ‘New Profession’, ‘profession’ ),
‘view_item’ => _x( ‘View Profession’, ‘profession’ ),
‘search_items’ => _x( ‘Search Professions’, ‘profession’ ),
‘not_found’ => _x( ‘No professions found’, ‘profession’ ),
‘not_found_in_trash’ => _x( ‘No professions found in Trash’, ‘profession’ ),
‘parent_item_colon’ => _x( ‘Parent Profession:’, ‘profession’ ),
‘menu_name’ => _x( ‘Professions’, ‘profession’ ),
);

$args = array(
‘labels’ => $labels,
‘hierarchical’ => false,
‘public’ => true,
‘show_ui’ => true,
‘show_in_menu’ => true,
‘supports’ => array( ‘title’, ‘thumbnail’),
);

register_post_type( ‘profession’, $args );
}
[/sourcecode]

Step 2: Add the necessary libraries in your theme/plugin
Creating metaboxes is a tedious and boring task. So we will take help of one of the fantastic metabox libraries out there. We will be using Custom-Metabox-Framework which is also widely known as “CMB”. It will make our code a lot less cluttered. So download (or checkout) the library, unzip and rename the folder as “cmb” and place it inside your theme folder. Now add the following code in your functions.php

[sourcecode language=”php”]
add_action( ‘init’, ‘mytheme_initialize_cmb_meta_boxes’ );
function mytheme_initialize_cmb_meta_boxes() {
if ( !class_exists( ‘cmb_Meta_Box’ ) ) {
require_once( ‘cmb/init.php’ );
}
}
[/sourcecode]

Step 3: Create some metaboxes for this profession custom post
Now we have all the necessary tools available, lets create three metaboxes and attach them with only this “profession” type custom post.

[sourcecode language=”php”]
function mytheme_profession_metaboxes( $meta_boxes ) {
$prefix = ‘_mytheme_’; // Prefix for all fields
$meta_boxes[] = array(
‘id’ => ‘profession_details’,
‘title’ => ‘Profession Details’,
‘pages’ => array(‘profession’), // post type
‘context’ => ‘normal’,
‘priority’ => ‘high’,
‘show_names’ => true, // Show field names on the left
‘fields’ => array(

array(
‘name’ => ‘Your Name’,
‘id’ => $prefix . ‘name’,
‘type’ => ‘text’
),
array(
‘name’ => ‘Profession Type’,
‘id’ => $prefix . ‘profession_type’,
‘type’ => ‘select’,
‘options’=>array(
array("name"=>"Select a Profession","value"=>0),
array("name"=>"Photographer","value"=>1),
array("name"=>"Programmer","value"=>2),
)
),
),
);

$meta_boxes[] = array(
‘id’ => ‘profession_photographer’,
‘title’ => ‘Some details of your <b>photography</b> job’,
‘pages’ => array(‘profession’), // post type
‘context’ => ‘normal’,
‘priority’ => ‘high’,
‘show_names’ => true, // Show field names on the left
‘fields’ => array(
array(
‘name’ => "Your Camera",
‘id’ => $prefix . ‘photography_camera’,
‘type’ => ‘text_medium’
),
array(
‘name’ =>"Your primary interest is",
‘desc’ => ‘Landscape/Portrait/Street/Lifestyle’,
‘id’ => $prefix . ‘photography_interest’,
‘type’ => ‘text_medium’
),
),
);

$meta_boxes[] = array(
‘id’ => ‘profession_programmer’,
‘title’ => ‘Some details of your <b>programming</b> job’,
‘pages’ => array(‘profession’), // post type
‘context’ => ‘normal’,
‘priority’ => ‘high’,
‘show_names’ => true, // Show field names on the left
‘fields’ => array(
array(
‘name’ => "Your Favorite IDE",
‘id’ => $prefix . ‘programming_ide’,
‘type’ => ‘text_medium’
),
array(
‘name’ =>"Your primary language",
‘desc’ => ‘C/PHP/Java/Python/Javascript’,
‘id’ => $prefix . ‘programming_lang’,
‘type’ => ‘text_medium’
),
),
);

return $meta_boxes;
}

add_filter( ‘cmb_meta_boxes’, ‘mytheme_profession_metaboxes’ );
[/sourcecode]

At this point, if we click on “New Profession” from our WordPress admin panel, we will see the editor screen like this. Please notice that we have already disable the “editor” field while registering this custom post (using the “supports” attribute)

The Profession Screen

Uh, oh! that looks very confusing for people of both professions. I mean asking the photographer about their favorite language and ide is utter nonsense, and vice versa. So How can we make sure that only photographers will see the second metabox container, and programmers will see the third metabox container? Lets do this!

Step 4: The Magical Ingredient: Adding the interactivity using Javascript
We need to add some javascript at this point to improve the user experience at this point. Create a new javascript file inside the “js” folder inside your theme folder. Name the file as “profession-admin.js”. Now we need to make sure that this file is loaded properly in the admin panel.

[sourcecode language=”php”]
function mytheme_admin_load_scripts($hook) {
if( $hook != ‘post.php’ && $hook != ‘post-new.php’ )
return;

wp_enqueue_script( ‘custom-js’, get_template_directory_uri()."/js/profession-admin.js" );
}
add_action(‘admin_enqueue_scripts’, ‘mytheme_admin_load_scripts’);
[/sourcecode]

Now open the js/profession-admin.js and add the following code. Please keep in mind that jQuery is loaded in wordpress admin panel by default, and it works in no-conflict mode. So we want code like this if we want to use our favorite $ as a reference to the jQuery object.

[sourcecode language=”javascript”]
(function($){
$(document).ready(function(){
$("#profession_photographer").hide();
$("#profession_programmer").hide();

//lets add the interactivity by adding an event listener
$("#_mytheme_profession_type").bind("change",function(){
if ($(this).val()==1){
// photographer
$("#profession_photographer").show();
$("#profession_programmer").hide();
}else if ($(this).val()==2){
//programmer
$("#profession_photographer").hide();
$("#profession_programmer").show();
} else {
//still confused, hasn’t selected any
$("#profession_photographer").hide();
$("#profession_programmer").hide();
}
});

//make sure that these metaboxes appear properly in profession edit screen
if($("#_mytheme_profession_type").val()==1) //photographer
$("#profession_photographer").show();
else if ($("#_mytheme_profession_type").val()==2) //programmer
$("#profession_programmer").show();

})
})(jQuery);
[/sourcecode]

At this moment, when you click on the “New Profession” you will see like this.
Improved Profession Screen

And if you select a profession, the appropriate metabox will be displayed instantly.
Photography

That looks good eh? So what did our javascript do? Lets have a look at the things it does

  • It passes the jQuery object to our function as $
  • It hides all the secondary metaboxes related to the professions
  • It registers a new event listener that monitors the change event in our profession select box
  • It displays the appropiate metabox when someone picks a profession
  • It also displays the correct metabox when someone edits a profession

So that’s mainly it. We have made our profession screen look much better. And we are now collecting details about the particular profession without confusing people from other professions. And most of all, it is much friendlier than before 🙂

I hope you have enjoyed this article and already started planning to implement it in your next wordpress project. Have fun!

Shameless Plug
If you are looking for a fantastic NGinx+PHP-fpm based WordPress hosting with Solid Performance, give WPonFIRE a try. You will never be disappoint at all. And if you want a 25% discount coupon for life, let me know in the comment and I will arrange you one.

WPonFIRE Premium WordPress Hosting for Everyone