How to change DNS settings on your local PC

Have you ever been working on a website, changed your DNS settings over to a different server and later needed to access that server again from the old domain name for some reason? Well if you are an active developer, this situation is somewhat common. I’ll explain or you can skip the rest of this paragraph to quickly learn now to do it. Let’s say you own the domain name example.com and a web server with an IP address of 111.111.111.111. Now assume you have a WordPress blog on that server that you had to move to another server with IP 222.222.222.222. Let’s say you already changed the DNS settings for domain.com to point to the new server with IP 222.222.222.222 but you need to go back to the original WordPress site on the other server with an IP of 111.111.111.111. What do you do? We all know a WordPress site won’t function properly with just the IP address, so that is out. What you need to do is repoint example.com to 111.111.111.111 in order to access that WordPress site again. What a PITA, right? Well read on and I’ll show you a fast and easy way to make the site on the original server work with example.com even after you’ve pointed it to another IP address or web server! It’s as simply as controlling a local host file on your local PC to make example.com route to 111.111.111.111 even though the internet routes it to 222.222.222.222! Here’s how:

Using hosts file to override DNS settings for your PC

A lot of people don’t realize that when you make a request to the Internet using your local computer it first checks a local copy of the hosts file for an entry and only if one isn’t present it goes out to the Internet DNS servers. Therefore there’s an opportunity present for you to redirect example.com only for your own PC if you wanted to! Because there are also Affordable Mac Repairs in ipswich stores where you can get cheap laptops to try out these steps. Here are the easy steps:

  1. Open file explorer and navigate to C:\Windows\System32\drivers\etc.
  2. Open the file named “hosts” in notepad or another text editor that could be used as a code editor such as Notepad++, which is what I use.
  3. Now simply add a line to the end of the hosts file that contains the IP address of the server you want to route the domain name too followed by a space and then the domain name you want to reroute. So in our example scenario above, you would enter a new line that reads simply: 111.111.111.111 example.com
  4. Save the hosts file and open your browser and navigate to the domain which in our example was example.com. Note that there is a difference between example.com and www.example.com, so if you want it to work with www, you have to add another entry for www.example.com.

If you’re using Notepad++ or similar as I was, you’ll need to open it in administrator mode in order to be able to save the hosts file. Good luck! That’s all there is to it. IN case you failed, a mobile computer repair specialist operating near Boynton Beach is always ready to help.

How to change local DNS settings on a Mac

If you’re on a Mac, the instructions are basically the same but do this instead:

From the terminal, type:

nano /private/etc/hosts
and then add the IP and domain name as described above, so the only real difference between Mac and a PC when it comes to changing DNS settings is that you will use a different editor and the hosts file is located in different places.

 

 

wp_redirect Causing Page Isn’t Redirecting Properly Error

I was working on a client’s WordPress website today and had to do a redirect after successful login to his WordPress site. I tried to use wp_redirect with several different hooks including init, wp, wp_login, wp_redirect….etc. and none worked. I kept getting an error in Firefox that looked like this saying “The page isn’t redirecting properly….Firefox has detected that the server us redirecting the request for this address in a way that will never complete:

redirecterr

The Solution

So, in short Here is my solution. While I’m sure there may be another better way, this is the only one I found after two hours of trying to use wp_redirect. I simply used this line in place of where I would normally use wp_redirect:

echo “<script>document.location = ‘/my-account/’;</script>”;

So I essentially insert a JavaScript redirect into the page using PHP. Hackish? Yes, but it works and hopefully this post will save someone hours of wasted time trying to get wp_redirect to work!

 

How to Use PHP SESSION Variables in a WordPress Plugin

I was writing a WordPress plugin today that required me to use PHP SESSION variables so the app could save variables across multiple runs of the application. So at first, I tried using SESSION variables in my PHP code just like I would with any other PHP application outside of WordPress, but it failed. So read on for the solution I found that works perfectly and is as simple as adding three lines of code to your plugin or functions.php file.

Add this code to your main plugin file or theme’s functions.php file:

function register_session(){
    if(!session_id()) session_start();
}
add_action(‘init’,’register_session’);

Those four magic lines of code was all I had to add to my main plugin file to make the following code work:

<?php
// Start the session
session_start();

    if(isset($_SESSION[‘timesran’])){
        $_SESSION[‘timesran’]++;
        $runno = $_SESSION[‘timesran’];
    }else{
        $runno = 1;
        $_SESSION[‘timesran’] = 1;
    }
    echo “Run number $runno<br />”;
    ?>

So each time the WordPress plugin’s application is ran, it increments the timesran session variable successfully as long as I have already added the previous code snippet above to my plugin’s main file. The register_session function is needed for sessions to work and should be in your plugin’s index.php file or whatever file is your plugin’s main file. You can then use PHP session variables in any file within your plugin.

 

Extending WordPress XML-RPC Functions

XML-RPC is a great, somewhat little-known feature of WordPress that is perfect for accomplishing many remote tasks with WordPress. I have found it to be a valuable asset during plugin development. While there are numerous function built in to the XML-RPC WordPress library already, we are going to focus solely on extending the XML-RPC library to accomplish almost any remote WordPress tag you wish to. The focus of this article is going to be on using XML-RPC as a communication layer between two WordPress sites on different servers. The two sites could be on the same server, but it is important to know that they do not have to be.

Basic code to extend WordPress XML-RPC

function wp_testXMLRPC() {
$returnme = “XML-RPC is working!”;
return $returnme;
}//end wp_testXMLRPC extended XML-RPC function

function wp_extend_xmlrpc_methods($methods) {
    $methods[‘wp.testXMLRPC’] = ‘wp_testXMLRPC’;
    return $methods;   
}//end wp_extend_xmlrpc_methods
add_filter(‘xmlrpc_methods’, ‘wp_extend_xmlrpc_methods’);

That’s it! Add that code to your plugin file or theme’s functions.php file and you have successfully extended WordPress’ XML-RPC capabilities by adding a test function to test communication between two WordPress websites. Next I’ll show you how to use this code from another WordPress site. We can call the wp_testXMLRPC function from another WordPress website and it will return “XML-RPC is working!” if the XML-RPC functions are currently working on both WordPress sites involved.

Calling an XML-RPC function from another WordPress website

To call our custom extended XML-RPC function above from another WordPress site, we would make a custom page template or plugin file and add the following code where you want to display the results of the test_XMLRPC function:

<?php

$rpcurl = “http://example.com/xmlrpc.php”;//URL of site with custom XML-RPC function
$request = xmlrpc_encode_request(‘wp.testXMLRPC’);//wp_testXMLRPC = wp.testXMLRPC
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);

echo “<p>Results of XML-RPC wp_testXMLRPC function: $results</p>”;//output results

?>

That’s really all there is to it. However this is a simple function. It is also possible to create functions that accept and return parameter data and do complex WordPress actions etc.

How to pass parameters to an extended XML-RPC function and return values

The real power of XML-RPC becomes clear when you add the ability to pass values back and forth from one WordPress website to another! Soon we will examine how to pass a single parameter to an XML-RPC extended function. First, let’s look at how to make the function for WordPress site one:

<?php

function wp_sayHi($arg) {
// Array of WP_User objects.
$yourName = $arg[0];
$returnme = “Hello $yourName!”;
return $returnme;
}//end wp_sayHi extended XML-RPC function

?>

Then we have to add the code to extend the methods:

<php

function wp_extend_xmlrpc_methods($methods) {
    $methods[‘wp.sayHi’] = ‘wp_sayHi’;
    return $methods;   
}//end wp_extend_xmlrpc_methods
add_filter(‘xmlrpc_methods’, ‘wp_extend_xmlrpc_methods’);

?>

The above two sections of code need to get added to your functions.php or plugin file on the first WordPress site, the one you want to retrieve the data from. On the second WordPress site, the one you pass the data from, you would add the following code wherever you wanted to present the results of the XML-RPC function we made:

<?php

$your_name = “Ian Lin”;

$rpcurl = “http://example.com/xmlrpc.php”;
$argparam = array($your_name);
$request = xmlrpc_encode_request(‘wp.sayHi’,$argparam);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);

echo $results;

?>

The above code would print “Hello Ian Lin” to the screen wherever the code was called in a custom page template file or plugin file. Notice how we passed the $your_name vaiable as a parameter for the wp_sayHi function in lines 3 and 4 of the code above. $argparam puts the $your_name variable into a simple array before passing it to the $request made in the next line. Yes, XML-RPC functions accept arrays as parameters. Now let’s look at what to do if you wanted to pass two or more values to an XML-RPC function.

Passing Two or More Values to an extended XML-RPC Function

Here is a valuable nugget I’ll pass on to my readers that allows you to reset a user’s password on WordPress site one from WordPress site two! Yes, it allows you to reset a password from another site. The function takes two parameters to work. It needs the user_login name and the new password. Here’s the code that would go on WordPress site one:

<?php

function wp_syncPasswords($args) {
// Array of WP_User objects.
$userArg = $args[0];//gets user_login value passed in $args
$passArg = $args[1];//gets password from $args
//get user ID by login:
$userget = get_userdatabylogin($userArg);
$usergot = $userget->ID;//gets id of passed user
//update password:
wp_set_password($passArg, $usergot);
$returnme = $usergot.”~”.$userArg.”~”.$passArg;
return $returnme;
}//end wp_syncPasswords extended XML-RPC function

?>

There you have an XML-RPC function that allows you to actually change a user’s password remotely! Pretty neat huh?

Take notice of the $returnme variable in the above wp_syncPasswords function. It returns 3 values in a string separated by a tilde character. You could use any special character to separate the values, but I find the tilde to be safe and reliable, so that’s what I use a lot. I do this because you cannot return an array of values in an XML-RPC response. If I’m wrong, someone please enlighten me, but that’s what I’ve learned from my experience anyway. Then we would simply parse out the values in the response on WordPress site two when we call the function and get $results.

Of course next to have to extend the XML-RPC methods just like we did earlier. Please note that if you already have other XML-RPC functions in your functions.php or plugin file, then you wouldn’t rewrite the entire block of code to add additional functions as methods, you can simply add on to your previous functions. For example, here we’ll add on to our last extended XML-RPC function from above:

<php

function wp_extend_xmlrpc_methods($methods) {
    $methods[‘wp.sayHi’] = ‘wp_sayHi’;

$methods[‘wp.syncPasswords’] = ‘wp_suncPasswords’;
    return $methods;   
}//end wp_extend_xmlrpc_methods
add_filter(‘xmlrpc_methods’, ‘wp_extend_xmlrpc_methods’);

?>

Notice that this time, since we already had the wp_sayHi function extending XML-RPC previously, all we had to do is add the highlighted line to the wp_extend_xmlrpc_methods function above to make our new function valid and ready to call from another website such as WordPress site two.

Calling the wp_syncPasswords Function from a Remote WordPress Site Passing Two Parameters via XML-RPC

<?php

$userlog = “admin”;//set WordPress user name
$new_pass =”YOUR_PASSWORD_HERE”;//set new password
$rpcurl = “http://example.com/xmlrpc.php”;
$argparam = array($userlog,$new_pass);
$request = xmlrpc_encode_request(‘wp.syncPasswords’,$argparam);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);
}//end my_profile_update function by Ian L.

?>

Running the code above would change the password of the admin user to YOUR_PASSWORD_HERE, so be sure to change admin to an existing username on WordPress site one and change YOUR_PASSWORD_HERE to the value of the new password you want to set from WordPress site two. This code could go in a WordPress plugin, but probably not appropriate for a page template, however it is possible.

Notice in the above PHP code, how we passed two parameters by setting the value of $argparam to array($userlog, $new_pass). Then we pass $argparam array to WordPress site one in the XML-RPC request in the next line. It’s important to note how we pass one, two, or more parameters to XML-RPC functions. Now you should know how!

Some of you might be saying, “Hey, what about the returned results?” Well, you got me, I left them out to keep the code simple. It will work as it is above, but if you wanted to show the results returned you could do so by parsing the three values from the $results variable using something like this:

<?php

$myArray = explode(“~”, $results);

$remoteUserID = $myArray[0];

$remoteUserLogin = $myArray[1];

$remoteUserPassword = $myArray[2];

echo “<h2>User id: $remoteUserID with user login: $remoteUserLogin has had their password reset to $remoteUserPassword on WordPress site one!</h2>”;

?>

That just about covers everything you need to know about extending the XML-RPC functionality of WordPress. You can do just about anything you want with this tool of you are good with writing custom WordPress code. Happy coding!

Working with WordPress Advanced Custom Fields Image Repeater Fields

My latest WordPress project deals with remote updating of custom post types that use the Advanced Custom Fields Plugin. From here on out, I’ll simply refer to this plugin as ACF since it is such a long name and ACF is the generally accepted name among WordPress developers…

I am writing this post mostly because when working with ACF and repeater fields that have a sub field type of image, I wasn’t able to find sufficient documentation on the subject to complete my project. I did complete the project with a lot of trial and error and piecing together of bits of info from many sources. My goal is to document the subject as much as possible here in order to make life easier for anyone attempting to do similar tasks as I have done.

The Challenge:

My particular challenge was that I had to create a WordPress plugin that would sync posts that used a custom post type and ACF. The basic requirement was that the plugin would update several client sites with posts from a single master site. So, the master site had a custom post type named “farms” that had several ACF fields including a couple repeater fields, one of which used the “image” sub-field type which is the focus of this article. The main challenge for me was basically writing code to insert images into a post that used a repeater field that had two sub-fields(image and alt_tag) the image sub-field stored image data in an array and the alt_tag sub-field stored custom alt tag content for the image tag. Some of you might already be thinking: Why do you have an alt_tag sub-field when alt tag content is already stored in the image data array. Well, that is true. However, it was a requirement of the project, so that’s what I did.

 

The solution:

How to add WordPress Advanced Custom Fields(ACF) Image Repeater Fields with PHP Code

Today’s challenge is to add values to an ACF image repeater field from within a plugin or theme file using PHP code. I had a difficult time figuring this out myself due to not being able to find enough documentation on the subject, so I decided to document my findings here. I used a custom post type named “farms” with my example. You can use a regular post, page or any custom post type for your own project. Just note that wherever you see “farms” it is my custom post type and should be replaced with your own value.

Export one or more of the posts in question

A logical first step to solving this problem for me was to create an XML export file of one of the posts that I wanted to add repeater field values to. in order to accomplish this, first create a test post of the custom post type you will be working with and make sure that the repeater field is all set up using the ACF plugin. Be sure to add a minimum of two images under the repeater field so you can examine the data via the XML export file. See the image below for an example of my own test custom post type which was set up with proper data to export:

post

Now it’s time to export the post you just edited. To do this from wp-admin, click on “tools/export” and select the name of your custom post type. In my case, I select “farms” and click to export the posts as in the following image:

export

Open your XML file you downloaded and search for the post by title. Once you find the title, you could extract just that one post’s data by copying everything in between <item> and </item> and pasting it in a new  XML file. That makes it easier to read just the one post you are concerned with if you have a lot of posts and a long XML file to work with. Of course, this is an optional step. I have extracted my relevant post and also deleted some of the XML that wasn’t relevant to the task and here are the results:

<item>

<wp:postmeta>
<wp:meta_key><![CDATA[your_own_farm_pics]]></wp:meta_key>
<wp:meta_value><![CDATA[2]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[_your_own_farm_pics]]></wp:meta_key>
<wp:meta_value><![CDATA[field_57ab934d407ed]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[your_own_farm_pics_0_image]]></wp:meta_key>
<wp:meta_value><![CDATA[1862]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[_your_own_farm_pics_0_image]]></wp:meta_key>
<wp:meta_value><![CDATA[field_57ab934d407ee]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[your_own_farm_pics_0_alt_tag]]></wp:meta_key>
<wp:meta_value><![CDATA[first alt tag]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[_your_own_farm_pics_0_alt_tag]]></wp:meta_key>
<wp:meta_value><![CDATA[field_57ab934d407ef]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[your_own_farm_pics_1_image]]></wp:meta_key>
<wp:meta_value><![CDATA[1861]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[_your_own_farm_pics_1_image]]></wp:meta_key>
<wp:meta_value><![CDATA[field_57ab934d407ee]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[your_own_farm_pics_1_alt_tag]]></wp:meta_key>
<wp:meta_value><![CDATA[second alt tag]]></wp:meta_value>
</wp:postmeta>
<wp:postmeta>
<wp:meta_key><![CDATA[_your_own_farm_pics_1_alt_tag]]></wp:meta_key>
<wp:meta_value><![CDATA[field_57ab934d407ef]]></wp:meta_value>
</wp:postmeta>
</item>

Once you’ve located your post’s XML, you will want to find the portion that is relevant to your particular ACF repeater field. To do this, simply do a search for the repeater field slug name. My field was named “your own farm pics”, so the slug name I would search for would be “your_own_farm_pics”. The first instance you find of the repeater field name/slug will look something like this:

<wp:postmeta>
<wp:meta_key><![CDATA[your_own_farm_pics]]></wp:meta_key>
<wp:meta_value><![CDATA[2]]></wp:meta_value>
</wp:postmeta>

Due to the use of CDATA , the above may look a little more complex than it really is. For what we are doing, we can simply ignore all of the CDATA stuff so that the above would become more like this:

<wp:postmeta>
<wp:meta_key>your_own_farm_pics</wp:meta_key>
<wp:meta_value>2</wp:meta_value>
</wp:postmeta>

Basically what’s in between the XML tags is this:
<![CDATA[your_own_farm_pics]]>
The part you want is in between the opening and closing brackets after the word, CDATA. The rest can be ignored. In this case, all we want is: your_own_farm_pics.

Then, to show one more example of extractig data from CDATA, the next line looks like:
<wp:meta_value><![CDATA[2]]></wp:meta_value>
and the only part we want is the part after “CDATA[“, which is simply: 2

So examining the first poroption of relevent .xml code we can gather that the value of “your_own_farm_pics” is “2”.

Lets look at the next portion of XML that reads:
<wp:postmeta>
<wp:meta_key><![CDATA[_your_own_farm_pics]]></wp:meta_key>
<wp:meta_value><![CDATA[field_57ab934d407ed]]></wp:meta_value>
</wp:postmeta>
…okay, from what we’ve learned, this is what you should extract from the above XML:
field name(or key): _your_own_farm_pics
value: field_57ab934d407ed
I hope this part is clear to you. If it is not, then you’ll probably need to study an XML tutorial first to understand. But one thing you need to notice here is that the field name or key starts with an underscore, therefore it is different from the first meta key(_your_own_farm_pics instead of your_own_farm_pics).

Let’s go ahead and extract all of the relevant data from the .xml file. Basically you should be able to extract something similar to the following key/value pairs from the relevant portion of XML code:

your_own_farm_pics
2

_your_own_farm_pics
field_57ab934d407ed

your_own_farm_pics_0_image
1862

_your_own_farm_pics_0_image
field_57ab934d407ee

your_own_farm_pics_0_alt_tag
first alt tag

_your_own_farm_pics_0_alt_tag
field_57ab934d407ef

your_own_farm_pics_1_image
1861

_your_own_farm_pics_1_image
field_57ab934d407ee

your_own_farm_pics_1_alt_tag
second alt tag

_your_own_farm_pics_1_alt_tag
field_57ab934d407ef

As you can see there are 4 pieces of data for each image in the repeater field. This is because there are two sub-fields in this repeater field and each sub-field uses two key/value pairs. Notice the incremented numbers starting at 0. There is only a 0 and a 1 in this example because there are two images stored in our repeater field. so all the key names containing _0_ are one image’s data and then all the ones with key names containing _1_ are the second image’s data.

There are three parts to each key name. Each key either starts with the repeater slug or the repeater slug preceded by an underscore. Then there is a incremented number starting at zero. Finally we have the sub-field name. Here’s the pattern these sub-field key names follow:

repeater_field_name + incremented number + sub-field name

Above is the pattern for the data key. Below is the very similar patter for the field key:

underscore + repeater_field_name + incremented number + sub-field name

So knowing that, you should be able to know exactly how to read these XML files now. This also gives you a huge clue on how data is stored in the database as the key/value pairs in the XML file are exactly what is stored in the database. Therefore the values are exactly what needs to be written to the database in order to insert repeater images into a post or custom post type.

Let’s examine some PHP code now. Knowing what we do about the XML file, we know what data needs inserted into the database now, so our PHP code for the example XML file above should look like this in order to insert two images into a repeater field for a single post:

Note that the below code is for adding two sets of repeater field values. The repeater field is set up with two sub fields, one image sub-field and one simple text sub-field named alt_tag.

<?php

$post_id = “1902”;
//first two key/value pairs are for the repeater field name:
$key = “your_own_farm_pics”;
$value = “2”;
add_post_meta($post_id, $key, $value);

$key = “_your_own_farm_pics”;
$value = “field_57ab934d407ee”;
add_post_meta($post_id, $key, $value);

//next eight key/value pairs are for the two repeater field sub-field names:
//There are four key/value pairs for the first image and four more for the second:
//Start image one data:
$key = “your_own_farm_pics_0_image”;
$value = “1867”;
add_post_meta($post_id, $key, $value);

$key = “_your_own_farm_pics_0_image”;
$value = “field_57ab934d407ee”;
add_post_meta($post_id, $key, $value);

$key = “your_own_farm_pics_0_alt_tag”;
$value = “Alt tag content for image 1”;
add_post_meta($post_id, $key, $value);

$key = “_your_own_farm_pics_0_alt_tag”;
$value = “field_57ab934d407ef”;
add_post_meta($post_id, $key, $value);

//Start image two data:
$key = “your_own_farm_pics_1_image”;
$value = “1869”;
add_post_meta($post_id, $key, $value);

$key = “_your_own_farm_pics_1_image”;
$value = “field_57ab934d407ee”;
add_post_meta($post_id, $key, $value);

$key = “your_own_farm_pics_1_alt_tag”;
$value = “Alt tag content for image 2”;
add_post_meta($post_id, $key, $value);

$key = “_your_own_farm_pics_1_alt_tag”;
$value = “field_57ab934d407ef”;
add_post_meta($post_id, $key, $value);

?>

Of course the above PHP code would go in a custom plugin and wouldn’t work as standalone php code, but you should get that if you have any experience with writing WordPress plugins and if you do not, then this topic is far to advanced for you anyway. Try one of my starter tutorials for WordPress plugin developers instead.

 

Code explained:

First, you should notice the $postid variable that gets set to the post id you want to update with repeater fields.

Then you see three lines of code setting the $key variable to “your_own_farm_pics” which you will change to the name of your own repeater field name. The value of this needs to be equal to the number of repeaters you want to add. In this case, we are adding 2 images, so we set the value to 2.

Next you see the key of _your_own_farm_pics. This is the field value that is set in the database and is crucial in identifying the repeater field correctly, so be sure to get this right. Do an export of the database and search for the repeater field name to find the value for this if you have to. All you have to do it export the database as  XML and do a text search for the field name and you’ll see the value right below it. The code above uses the XML example code posted above in this post.

The next important section of code, where the comment says “//next eight key/value pairs are for the two repeater field sub-field names:“, is where you will have eight  sections with 3 lines of code each for the two image repeaters you add.  The important part to notice here is the numbering system used. Notice that the the first four sections of code have a zero in the keys, for example:

$key = “your_own_farm_pics_0_image”;

So the value of the $key variable in the above example is made up of three parts:

  1. repeater field name: your_own_farm_pics
  2. incremented number: 0
  3. sub-field name: image

In this example, my repeater field name is “your_own_farm_pics”,  the numbers start at 0 and go as high as the total number of repeater fields you add, the sub-field name in this case is “image”.

Then, skip down three more lines to where you see the code:

$key = “your_own_farm_pics_0_alt_tag”;

this is the second sub-field for the first repeater. so we follow the same principle as we did with the first sub-field which was image. The second sub-field name in this case is alt_tag, so we have:

  1. repeater field name: your_own_farm_pics
  2. number: 0
  3. sub-field name: alt_tag

That covers the first repeater field with it’s two sub-fields. Then we want to add another repeater field with the code starting at the comment that reads: “//Start image two data:“.

Notice that the number in the two $key variables has incremented to 1 in the second image’s code because the numbering starts at 0 and this is the second repeater or image added.

 Summary

I hope this article sheds some light on this dimly illuminated topic dealing with Advanced Custom Fields plugin and programming your own plugin to work with it. I had a very difficult time digging up enough information to piece the above code together myself, so I truly hope this helps someone attempting to do the same thing.

 

 

Passing PHP Variables to File included with get_template_part WordPress Function

Today I had a problem where I had a WordPress page template that used get_template_part to include a section of the page like WordPress themes often do. My problem was that I did some custom coding to the theme and found it necessary to pass a variable to the file included using get_template_part.

The Problem

Let’s say you have a custom page template for showing search results called special-search.php. Now let’s also say that the actual search results are displayed using another template file named content-searching.php. inside of special-search.php we would normally include the content-searching.php file something like this:

get_template_part( ‘template-parts/content’, ‘searching’ );

What’s wrong with that? Well, nothing unless you need to use PHP variables from special-search.php inside of content-searchnig.php. Then we have a problem. Read on for the simple solution!

Making it Possible to Pass PHP Variables to Template Parts:

The solution is actually to simply not use the get_template_part function! We can very effectively replace get_template part with a combination of the common PHP include function and the WordPress locate_template function like this:

include(locate_template(‘template-parts/template-name.php’, $load, $require_once));

As you can see the locate_template function is called inside of the include function and locate_template takes three parameters. While, you really only need to use the first parameter in many cases, it is good to know what the other two do as well, so here are all three parameters defined:

  1. ‘template-parts/template-name’ – will be changed to the path and filename to your template file you used to include with get_template_part. In our example case above, this parameter would get set to ‘template-parts/content-searching.php’.
  2. $load – is an optional Boolean parameter that would be set to either true or false, but which is set to false by default which is the desired setting in this case. This parameter tells the function whether or not to load the template file. We don’t want the template to be loaded by locate_template since it will get loaded by the include function in this case. So if we include this parameter, we would set it to false.
  3. $require_once – is the third parameter which is also optional and set to true by default. It simply determines whether we use require_once or require to include the template file. true = requrie_once and false = require.

Example Usage:

Still using our test case scenario from above, here is how we would use the include and locate_template function together to replace get_template_part and hence be able to use variables defined in the parent file inside of the template part file. Above we said we had a template file named special-search.php that used get_template_part to include a template part file named content-searching.php. Below I will demonstrate the change that would need to be made:

Change this line:

get_template_part( ‘template-parts/content’, ‘searching’ );

into this line:

include(locate_template(‘template-parts/content-searching.php’));

Notice how get_template_part doesn’t use the actual whole filename due to it’s unique naming convention rules, but our second method however must use the whole filename. Both cases call the same file however. If you change get_template_part into the include statement shown in our example, then you will now be able to use variables defined in special-search.php within content-searching.php. Problem solved!

How to add Custom Admin Meta Boxes to a WordPress Custom Post Type

I decided to write this detailed tutorial on how to add custom field meta boxes to the WordPress admin mostly because I couldn’t find a decent description of how to do it anywhere online. Hopefully this will help others having trouble trying to learn how to add admin meta boxes with custom fields for a custom post type in WordPress. It is an essential step to learning WordPress plugin development.

Let’s dive in and learn some code because I believe that is the quickest and easiest way to learn this advanced WordPress method. I say it is an advanced subject because it is a little complex for beginners. If you are not sure how to start your own plugin yet in WordPress, then this topic may be too advanced for you. You should at least learn how to make a very basic WordPress plugin first, so feel free to read one of my more basic WordPress plugin tutorials first.

First of all, I’ll show you how to add a single meta box with a single field in it. It is also important to know that you can have more than one field inside a single meta box. It is equally important to know that you can have more than one meta box. Each meta box can have one or more fields in them. It just depends on your individual needs. Below is the basic code for how to add a custom post type with a custom field inside of an admin meta box. I’ll also include a basic plugin heading so you may follow along and create a working example to work from:

Adding a Custom Post Type to WordPress Plugin

<?php
/**
 * Plugin Name: Jafty Metabox Example Plugin
 * Plugin URI: http://jafty.com/blog/crash-course-on-wordpress-plugin-development/
 * Description: A Plugin that adds metaboxes to your WordPress blog or site.
 * Version: 1.0
 * Author: Ian L. of Jafty.com
 * Author URI: http://jafty.com
 * License: GPL2
 */
 

 //Add new Custom Post Type named videos:
add_action(‘init’, ‘create_video_posttype’);
function create_video_posttype(){
    register_post_type(‘videos’,
        array(
            ‘labels’ => array(
            ‘name’ => __(‘Videos’),
            ‘singular_name’ => __(‘Video’)
            ),
        ‘public’ => true,
        ‘has_archive’ => true,
        ‘rewrite’ => array(‘slug’ => ‘video’),
        )
    );
}//end create_video_posttype function

?>

Okay, now start a .php file and add the above code in green to the start of it. Name the file “jafty-metabox-example-plugin.php” and save it. Please NOTE: it is important to go into wp-admin/settings/permalinks and re-save those settings after activating a plugin with a custom post type or after adding a custom post type to a plugin. If you do not do this, the custom post type posts will not show up on the front end of your blog.

At this point, you should be able to upload the jafty-metabox-example-plugin.php file to your WordPress site’s plugins folder and activate it. If it works, you’ll see a new “Video” option in the left navigation menu of wp-admin as in the following photo:

videoCPT

Add a Metabox with a Custom Field to your CPT

Now here is the code to add to the end of the file you started above(just before the closing PHP tag) that will add a meta-box with a custom field inside of it to your plugin. It adds a field to the wp-admin edit screen for the videos CPT(custom post type):

//Add custom admin Meta Boxes:
add_action(‘add_meta_boxes’, ‘add_ians_metaboxes’);
function add_ians_metaboxes(){
//add meta box for Video type and description:
add_meta_box(‘meta_box_html_id’, ‘Video Details’, ‘video_details_function’, ‘videos’, ‘normal’, ‘high’);
}

//##################### Video Details Metabox: ################
function video_details_function() {
global $post;  
//Noncename needed to verify where the data originated
echo ‘<input type=”hidden” name=”eventmeta_noncename” id=”eventmeta_noncename” value=”‘ .
wp_create_nonce(plugin_basename(__FILE__)) . ‘” />’;

//Get video description data if its already been entered
$video_desc = get_post_meta($post->ID, ‘_video_desc’, true);
    
//Start video Description text field HTML:
?>
Video Description:
<input type=”text” name=”video_desc” value=”<?php echo $video_desc; ?>” class=”widefat” />
<?php
}//end video_details_function

Save the “jafty-metabox-example-plugin.php” file and update it on your site and click on the “Video” link in wp-admin and then click on “Add New” to see the add/edit screen for your new CPT. You will notice your  custom meta-box with the heading of “Video Details”. You will also notice the meta-box contains a custom field named “Video Description”. You can see both near the bottom of the photo below:

customField

Saving Custom Field Data

Your not quite done however. While the code above will display the metaboxes, it does not save the data as I soon discovered. To save the data, you’ll need to add this code directly after your video_details callback function:

//hook into save_post to save the meta box data:
add_action (‘save_post’, ‘save_video_desc’);

function save_video_desc($post_id) {
//verify the metadata is set
     if (isset( $_POST[‘video_desc’])) {
     //save the metadata
     update_post_meta ($post_id, ‘_video_desc’, strip_tags($_POST[‘video_desc’]));
     }
}

 

 Adding Multiple Meta-Boxes and Custom Fields

Next I’ll show you what our final plugin file would look like if we were to add another custom field to our meta-box and then another meta-box with yet another custom field inside of it. This way you can see how more than one meta-box is added and also how to add more than one field inside of a single meta-box. Here is the complete plugin code containing a total of two meta-boxes and three total custom fields:

<?php
/**
* Plugin Name: Jafty Metabox Example Plugin
* Plugin URI: http://jafty.com/blog/crash-course-on-wordpress-plugin-development/
* Description: A Plugin that adds metaboxes to your WordPress blog or site.
* Version: 1.0
* Author: Ian L. of Jafty.com
* Author URI: http://jafty.com
* License: GPL2
*/

//Add new Custom Post Type named videos:
add_action(‘init’, ‘create_video_posttype’);
function create_video_posttype(){
register_post_type(‘videos’,
array(
‘labels’ => array(
‘name’ => __(‘Videos’),
‘singular_name’ => __(‘Video’)
),
‘public’ => true,
‘has_archive’ => true,
‘rewrite’ => array(‘slug’ => ‘video’),
)
);
}//end create_video_posttype function

//Add custom admin Meta Boxes:
add_action(‘add_meta_boxes’, ‘add_ians_metaboxes’);
function add_ians_metaboxes(){
//add the first meta box for Video type and description:
add_meta_box(‘meta_box_html_id’, ‘Video Details’, ‘video_details_function’, ‘videos’, ‘normal’, ‘high’);
//add a second meta box for Video Rating
add_meta_box(‘meta_box_html_id2’, ‘Video Rating’, ‘video_rating_function’, ‘videos’, ‘normal’, ‘high’);
}
//################## Video Details Metabox: ####################
function video_details_function() {
global $post;

//Noncename needed to verify where the data originated
echo ‘<input type=”hidden” name=”eventmeta_noncename” id=”eventmeta_noncename” value=”‘ .
wp_create_nonce(plugin_basename(__FILE__)) . ‘” />’;

//Get the video type  if its already been entered
$video_type = get_post_meta($post->ID, ‘_video_type’, true);
// Get the video description if its already been entered
$video_desc = get_post_meta($post->ID, ‘_video_desc’, true);

//Start type select field HTML:
?>
Video Type: <select name=”video_type”>
<option value=”DVD”<?php if($video_type==”DVD”)echo ” selected”;?>>DVD<option>
<option value=”Blueray”<?php if($video_type==”Blueray”)echo ” selected”;?>>Blueray<option>
</select><br />
<?php
// Start video description field HTML:
?>
Video Description:
<input type=”text” name=”_location” value=”<?php echo $video_desc; ?>” class=”widefat” />
<?php
}//end video_details_function
//##################### Video Rating Metabox: ###################
function video_rating_function() {
global $post;

//Noncename needed to verify where the data originated
echo ‘<input type=”hidden” name=”eventmeta_noncename” id=”eventmeta_noncename” value=”‘ .
wp_create_nonce(plugin_basename(__FILE__)) . ‘” />’;

//Get the start_month data if its already been entered
$video_rating = get_post_meta($post->ID, ‘_video_rating’, true);

//Start type select field HTML:
?>
Video Type: <select name=”_video_rating”>
<option value=”R”<?php if($video_rating==”R”)echo ” selected”;?>>R<option>
<option value=”PG”<?php if($video_rating==”PG”)echo ” selected”;?>>PG<option>
</select><br />
<?php
}//end video_rating_function
?>

//add your save data hook and function to save all fields here:

//hook into save_post to save the meta box data:
add_action (‘save_post’, ‘save_video_data’);

function save_video_data($post_id) {
//verify the metadata is set
     if (isset( $_POST[‘video_desc’])) {
     //save the metadata
     update_post_meta ($post_id, ‘_video_type’, strip_tags($_POST[‘video_type’]));

    update_post_meta ($post_id, ‘_video_desc’, strip_tags($_POST[‘video_desc’]));

    update_post_meta ($post_id, ‘_video_rating, strip_tags($_POST[‘video_rating’]));
     }
}

That’s it! Save the above code in a PHP file and name it the same name as before and allow it to overwrite the original plugin file if you were following along and it will add another meta-box and a couple more custom fields to your custom post type. Now you should have enough information to be able to make your own custom admin meta-boxes and fields for your next WordPress plugin or theme. Here is an image of the two meta-boxes from when I tested the above code myself:

metaboxes

Summary

Now you should know more than enough to make your own plugin or custom theme with its own admin meta-boxes and custom fields for any custom post types you may have. It is important to know that you can also use any other type of form element in the above examples. Feel free to experiment and use textareas, radio buttons, checkboxes etc in your own code.

 

How to Include a CSS Style Sheet for a WordPress Page Within a Plugin

For years I used to simply include CSS styles in WordPress plugins that I made for myself by doing it the same ways that you would for a pure HTML website like:

The Wrong Way:

<style>
p{
font-family: arial;
}
</style>

Or I would do it like this with an external stylesheet:

<link rel='stylesheet' href='http://jafty.com/wp-content/plugins/plugin-name/css/frontend-style.css' type='text/css' media='all' />

But I found out later when I started making professional plugins for clients that there is a more correct way to do it when using WordPress.

The Right Way to Include CSS Styles in a WordPress Plugin:

The right way to include a style sheet in a custom WordPress frontend page generated by a plugin you are making is to create the style sheet in an external CSS file and include it like this:

In your plugin’s main PHP file include:

<?php

//Add frontend styles for the calendar page:
$pluginURL = plugins_url(“”,__FILE__);
$CSSURL = “$pluginURL/CSS/frontend-style.css”;//change to your filename and path
wp_register_style( ‘frontend_CSS’, $CSSURL);

?>

Then,  wherever you want your style to show up, include this:

wp_enqueue_style(‘frontend_CSS’);

I include the wp_enqueue_style function call write after wp_head normally in my custom page’s header.

I normally like to have a folder inside my main plugin folder named “CSS” or “style” where I put all my CSS style sheets for the plugin. You can see I used “CSS” in the above example. You would of course alter the URL according to the folder you placed the CSS file in. The plugins_url function used with the __FILE__ definition as the second parameter will give the full URL to the plugin when it is called within the main plugin file. I normally name the main plugin file after the plugin name or sometimes i name it index.php, but regardless, the code would be the same as long as it is within the main plugin file.

In the abov example my style sheet was named frontend-style.css, yours could be named anything you like.

How to Stop Admin Emails Upon New User Registration in WordPress

It took me quite a bit of messing around to stop admin emails on new user registration to my WordPress site today, so I’m documenting the final solution here. The key is the pluggable function named wp_new_user_notification, but simply replacing the function in your theme’s functions.php file does not always(or maybe ever) work, so the final solution I found to work was to replace the pluggable wp_new_user_notification function inside a very simply light-weight plugin. Simply copy and paste the code below into a file and name it Disable_User_Notifications_To_Admin.php. Then upload it to your site’s plugins directory and go to wp-admin and activate it. Simple, easy, quick and DONE!

 

<?php
/**
 * @package Disable_User_Notifications_To_Admin
 * @version 1.0
 */
/*
Plugin Name: Disable User Notifications To Admin
Plugin URI: http://jafty.com/blog
Description: This is just a simple plugin to stop those annoying admin emails each time a new user registers to your site. simply change the value of linian11@yahoo.com in the main plugin file with the email you do not want to recieve notifications at and it will block them.
Version: 1.0
Author URI: http://jafty.com
*/
/*
change the value of linian11@yahoo.com below with the email you do not want to recieve notifications at and it will block them.
*/
if(!function_exists(‘wp_new_user_notification’)) :

function wp_new_user_notification($user_id, $plaintext_pass = ”) {
    $user = get_userdata($user_id);
    $blogname = wp_specialchars_decode(get_option(‘blogname’), ENT_QUOTES);

    if ( empty($plaintext_pass) )
        return;

    $message  = sprintf(__(‘Username: %s’), $user->user_login) . “\r\n”;
    $message .= sprintf(__(‘Password: %s’), $plaintext_pass) . “\r\n”;
    $message .= wp_login_url() . “\r\n”;
if($user->user_email != “linian11@yahoo.com”)
    wp_mail($user->user_email, sprintf(__(‘[%s] Your username and password’), $blogname), $message);

}
endif;

?>

Summary

That’s pretty much guaranteed to work if nothing else has.

 

You Can Now Contribute Web Development Content

Jafty Interactive Web Development has decided to start accepting user contributed blog posts! You can now submit any post that is related to out blog theme of web development and it will be published after admin moderation. Along with posting articles, they even teach their clients where to find a cheap web design which can help them save a ton on the marketing sector of their business. Jafty also is in association with many SEO audit services, which’ll only increase the exposure we get on your submitted blogs. As long as it is on topic and I think it improves the quality of my blog, it will probably be published. Some topics I picked from https://onlinemoneypage.com/ and would like to encourage users to submit posts about include:

  • PHP
  • JavaScript
  • HTML
  • XML
  • CSS
  • Search Engine Optimization/SEO and The best service curating it
  • Freelancing as a web developer
  • Freelance writing
  • working from home
  • Laravel
  • WordPress
  • C Languages
  • Java
  • ASP.net
  • JQUERY
  • Ruby on rails
  • MySQL Database
  • SQL
  • PHP and MySQL
  • Remote server administration
  • Linux Command Line
  • Linux and Windows Servers
  • MAC and web development
  • PC vs MAC
  • Mobile Development
  • Mobile website optimization
  • PERL
  • AJAX
  • Adwords
  • CURL
  • Graphics
  • anything else related to web development!

That’s just a list to fuel your mind. Feel free to submit any related topic. I will accept anything related to web development. I’m looking forward to some great blog posts! – Ian L.

Click Here to Sign Up and Begin Writing!

Get WordPress Current Version Number with PHP

Today I wrote a great little PHP script that fetches the Current release number of WordPress. It goes like this:

<?php
//WP Version checking by Ian L. of Jafty.com:
$url=’https://api.wordpress.org/core/version-check/1.7/’;

$contents = file_get_contents($url);
$contents = utf8_encode($contents);
$obj = json_decode($contents);

$upgrade = $obj->offers[0];
$WPversion = $upgrade->version;
echo “WP Version: $WPversion<br />”;
?>

 

Also you will find the following link very useful for hiding various notifications in WordPress:

http://www.wpoptimus.com/626/7-ways-disable-update-wordpress-notifications/

How to Get Rid of Yellow Background in Form Fields for Google Chrome and Safari for Mac

One of my old clients came to me today and says that the form fields on his login page have a yellow background color. He has a WordPress site and I know I had never seen yellow on this login page form before. I use a PC not a Mac, so I never noticed that this problem was present when using Safari on Mac. I’ve also read it happens with Google Chrome. I’m not sure if it happens on PC, but know it does on Macs. Here is the solution, simply add the following code to a style sheet connected to the page. In my case, since it was a wordpress site, I added it to my main theme’s style.css file:

input:-webkit-autofill {
    -webkit-box-shadow:0 0 0 50px white inset; /* Change the color to your own background color */
    -webkit-text-fill-color: #333;
}
input:-webkit-autofill:focus {
    -webkit-box-shadow: /*your box-shadow*/,0 0 0 50px white inset;
    -webkit-text-fill-color: #333;
}

How to Fix WordPress Automatic Updates

I’ve struggled with WordPress automatic updates not working several times being a web developer and WordPress expert, so I figured it is time to document one of the most successful and unknown solutions to this problem.

The reason is usually permissions related and unfortunately, that’s all a lot of help sites and WordPress related blogs will tell you. Well, what’s that mean? I’ll dive into it a bit further and give you an actual solution that worked for me more than once!

How to fix WordPress Permissions Issues

First you Login to your server box using ssh. I like to use a little program known as Putty to accomplish this. If you don’t have Putty, a simple Google search will take you right to the download page. It is a very small program so no worries. Login to your server’s command prompt however you wish though and type this:

ps aux | grep ‘apache’

if you copy and paste, make sure the single quotes come out okay as sometimes they don’t. However, I’ve fixed the issue in WordPress that uses fancy quotes so you shouldn’t have that problem on my blog, but it’s good to know that when copy and pasting from anywhere. After you type ps aux | grep ‘apache’ you should get a repsponse something similar to:

root      1182  0.0  0.0 103244   832 pts/0    S+   20:16   0:00 grep apache
apache    9529  0.0  3.7 559900 147600 ?       S    11:32   0:17 /usr/sbin/httpd
apache   18218  0.0  3.0 532892 121648 ?       S    Nov22   1:30 /usr/sbin/httpd
apache   18519  0.2  3.6 557696 146616 ?       S    Nov22   6:22 /usr/sbin/httpd
apache   12520  0.0  3.0 532912 121860 ?       S    Nov22   1:28 /usr/sbin/httpd
apache   18521  0.0  3.6 557276 145804 ?       S    Nov22   1:33 /usr/sbin/httpd
apache   18523  0.1  2.8 525748 114676 ?       S    Nov22   4:13 /usr/sbin/httpd
apache   18524  0.0  2.7 522360 111176 ?       S    Nov22   1:35 /usr/sbin/httpd
apache   18525  0.0  3.3 543872 132776 ?       S    Nov22   1:29 /usr/sbin/httpd
apache   18929  0.1  3.3 542832 131656 ?       S    Nov22   3:41 /usr/sbin/httpd
apache   18931  0.0  3.8 562724 151596 ?       S    Nov22   1:43 /usr/sbin/httpd

You want to go with the user name listed after the first line because your first line will read root user probably. the username is the first word on the line. In this case the user named is “apache” and your user could be different so go by what your command line interface gives you on the second line and the ones after that.

Now that we know the user controlling WordPress, we need to ensure that it has complete and proper control over WordPress by changing all users in the root directory of WordPress to that same user which in this case was apache. Use this command to do so from your command prompt on your server:

chown -hR apache:apache path/to/wordpress

Simply change “apache” with the user you discovered using the previous command described above and “path/to/wordpress” to the correct path. Then this should change all your wordpress directory files and folders over to the proper user.

 

 

 

Making a Mobile App from a WordPress Site

To be competitive in the online market, we all know you need to have a regular website as well as a mobile  website or at least a regular website that is mobile-friendly. Well, these days, that’s not enough any longer. You also need to have an app!

The App Era

Why do I need an app when I already have a mobile friendly website?

If you are wondering why you should also have an app, here are some of the more important reasons why you should have an app that features your website in addition to the site itself:

  • We now live in the “era of the apps” or the “app era” as I call it. There are millions of people that use apps everyday but rarely go to their browser to look something up, so by having an app, you expand your viewing audience greatly to a fresh market segment that you would otherwise have no exposure to.
  • Promotion of your website online and in an app store – By making an app out of your already existing mobile website, you can offer it for free in the Google Play Store, Apple/ITunes’ App Store and various download locations online.
  • Convenient – since you already have the website made, it’s easy to wrap it a native mobile app wrapper with a little know how or you can hire someone to do it for a lot less then the cost of creating a complete app from scratch.

WordPress Sharing to Promote your Blog

I can not emphasize the importance of sharing enough if you wish to gain a respectable amount of traffic on your WordPress blog or website! The Jetpack plugin has just about all the share features you could want outside of some special interests of course. I personally use Jetpack to connect this WordPress site to my Facebook, Twitter, Google+, Pinterest, LinkedIn, and eMail. Tumblr, StumbleUpon, Reddit and Pocket are also readily available. Use as many of these services as you can(at least 4 or 5) and you’ll notice traffic increased to your site soon! You also have to publish regularly as that’s what triggers sharing, but that’s why you have a blog right? Get to work!

Can’t Find Sharing Settings in WordPress?

Sharing settings are located in wp-admin under Settings/Sharing. If the Sharing link doesn’t appear under the main settings link in wp-admin, that most likely means that you do not have JetPack installed. Install JetPack and your sharing link should appear instantly. Once you click on settings, the sharing link will appear as a sub-link under settings.

Signing up for Social Media Sites

JetPack and WordPress sharing do not work without social media, so you will need to sign up for as many social media sites included in the JetPack/WordPress sharing options as possible! You can sign up to all of them very easily simply by installing JetPack, navigating to wp-admin/settings/sharing and clicking on the various service links to establish connections and sign up for any that you have not already signed up for.

Summary

I only wrote this simple advice on my blog because I think it is something that a lot of people over look. It’s a shame to not participate in such a simple method to increase traffic to your blog.  Most people think they will have to post to each of the social media sites individually and assume it will be too much work, but that’s not quite true because if you use the JetPack plugin with WordPress, it will post to most of the popular social medial sharing sites for you every time you write a new post or page on your WordPress site! This makes life nice and easy, so try it today!

Using add_filter and add_action Inside a Plugin

Someone correct me if I am wrong, but I discovered from trial and error today that you have to deactivate and activate a plugin each time you use add_filter or add_action inside of the main plugin index.php file. I only tried add_filter, but I assume add_action is the same… I tried several times to get an add_filter hook to work from a plugin’s index.php file that previously worked in my theme’s functions.php file to no avail. The solution seemed to be deactivating and reactivating the plugin after adding a filter or action hook to index.php, but please someone comment on this post if they know differently or can confirm this behavior for WordPress plugin creators.

Using XMLRPC to get a List of Posts from WordPress

Today I’m going to demonstrate how one can go about remotely fetching a list of posts for any post type including custom post types remotely using XML-RPC in WordPress. What I thought was going to be a simple task ended up taking me the majority of an entire day to work out yesterday, so I am posting my solution here for future reference and to help others solve the same problem.

So during my quest to figure out a solution for listing posts for a remote WordPress blog inside the wp-admin of another WordPress blog, I came across a couple promising functions such as wp.getPosts, blogger_getRecentPosts and similar existing XML-RPC functions that reside within wp-includes/class-IXR.php. None of those did the trick however, so below is the final solution I came up with which involves extending the XML-RPC class noted.

Extending the XML-RPC functions in WordPress

Here’s what you can add to your theme’s functions.php or plugin file to extend the class-IXR.php class to allow remote listing of post titles for any given registered post type:

function wp_getTits() {
// Get the ‘Profiles’ post type
/*$args = array(
    ‘post_type’ => ‘oils-blends’,
);*/
$args = array(
‘nopaging’ => true,
‘numberposts’    => 300,//increase if more than 300 products exist!
‘post_type’        => ‘oils-blends’,
‘post_status’   => ‘publish’//only exporting published products!
);
$loop = new WP_Query($args);
$tits = “”;
while($loop->have_posts()): $loop->the_post();

$titis = get_the_title();
$tits .= $titis.”zxz”;

endwhile;
wp_reset_query();
return $tits;
}

function wp_new_xmlrpc_methods( $methods ) {
    $methods[‘wp.getTits’] = ‘wp_getTits’;
    return $methods;   
}
add_filter( ‘xmlrpc_methods’, ‘wp_new_xmlrpc_methods’);

After you add the above code to functions.php or your plugin file, then you can use the following block of code within a plugin file of another WordPress site to remotely list the posts of a WordPress blog on another server. I added the following code inside my plugin which was used to post to a remote WordPress site. I needed to read the existing posts in order to know whether to write or update the posts that I was pushing to the second blog:

<?php
echo “<p>Starting to get posts from remote website…</p><h3>List of Titles:</h3>”;

$rpcurl = “http://example.com.au/wordpress_dir/xmlrpc.php”;

$request = xmlrpc_encode_request(‘wp.getTits’,’1′);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
//echo “Curl results: $results<hr />”;
curl_close($ch);
//separate titles by zxz string:
$titleArray = explode(“zxz”,$results);
    foreach($titleArray as $curTit){
        echo “$curTit<br />”;
    }//END FOREACH TITLE
echo “<p>Finished…</p>”;

?>

That’s all folks. Now you can remotely fetch posts from one WordPress site to another without any prior knowledge of post IDs etc. Now if you do know the post IDs, then you could use the existing XML-RPC method, wp.getPost which uses the post ID as an argument. I’ll share this code with you too even though it wasn’t the final solution for me, it could work for someone that happens to know the post IDs for which they need to grab remotely. The following code was tested and working as of WordPress version 4.2.3:

Listing Posts Remotely using wp.getPost

As you will see, it is a lot easier to get post data when you know the post ID. Here is all you have to add to your WordPress plugin file to remotely grab a post using wp.getPost when you know the post’s ID:

<?php
echo “<p>Starting to get post data from remote site…</p>”;

$rpcurl = “http://example.com.au/wordpress_dir/xmlrpc.php”;
$username = ‘admin’;
$password = ‘password’;
$post_id = 2820;
include(‘../wp-includes/class-IXR.php’);  
        $client = new IXR_Client($rpcurl);
     
        $USER = $username;
        $PASS = $password;
               
        if (!$client->query(‘metaWeblog.getPost’,$post_id, $USER,$PASS))
        {  
            echo(‘Error occurred during getting post.’ . $client->getErrorCode().”:”.$client->getErrorMessage());  
        }
        $post = $client->getResponse();
       
        var_dump($post);
echo “<hr /><p>Finished….</p>”;
?>

Of course you have to edit the URL, username and password above, but after that it will work fine.

Summary

So I’ve given you two ways to get post data from WordPress sites remotely. If you know the post IDs, then use the last method which is simpler, otherwise you have to extend the class explained above using the first two code snippets on this page. Good luck!

Fixing Encoding Problems When Creating WordPress Posts With PHP

I’m documenting this simple fix because it took me over an hour to figure out. I was writing a WordPress plugin that would publish custom post types from one blog to many others. In doing so, I used PHP to write code that would read posts from the master blog and write them to another blog, or several blogs actually. The problem was that some characters such has hyphens and the letter y would end up encoded incorrectly in the blog that the post was copied to. Here’s two images that show what happened. The first is an image of the WYSIWYG editor in WordPress when viewing the post in the edit screen using the text tab. The second image is when viewing the post in the HTML tab of the WYSIWYG editor:

txt htm…so as you can see in the areas I’ve circled above, there is definitely something wrong with the character encoding happening somewhere.

Fixing Character Problems in WordPress and PHP

The solution was to use the following line of code on the post text before writing it to the WordPress database:

$txt = iconv(“UTF-8”, “ISO-8859-1//TRANSLIT”, $txt);

By using the PHP iconv function to convert the txt variable to a new encoding, I was able to stop the encoding problem and all was great! I’m not going to explain this in detail because frankly the finer details of PHP and HTML encoding elude me to this day after coding for over 15 years. I understand we need different encoding for different languages, but why can’t we have more of a standard? It would make life so much easier!

Summary

I hope this helps someone as it did me. Good luck with your own encoding problem. I find it is often necessary to play with several PHP encoding functions to solve various problems, so if this doesn’t do the trick, try htmlentities or utf8_encode and similar PHP functions to modify your text.

CodeLobster All-in-One Coding Software

CodeLobster PHP Edition Software Review

Written by Ian Lincicome of Jafty Interactive Web Development – Jafty.com

For the past couple of weeks, I have been evaluating CodeLobster’s latest release of “CodeLobster PHP Edition” which I’ll refer to as simply “CodeLobster” from here on out in this review. The current edition at the time of writing this review was CodeLobster PHP Edition Professional Version 5.4. I am reviewing CodeLobster because I am looking for a tool I can use for my web development business, Jafty Interactive Web Development. Also I was given a break on purchasing the pro version of CodeLobster in exchange for writing a product review on my site, Jafty.com. Please note that I am under no obligation to write a positive review. I will be as brutally honest as ever, I assure you. This review will include both the pros and cons of using CodeLobster rather than a one-sided review like many company’s probably hire writers to write. In fact, if that was my intention, I wouldn’t have mentioned that the someone had asked me to write this review. My ulterior motive for writing the review is to find the perfect program to do my work for my business. The rest of the sectors, like recruiting a marketing team and hiring Salesforce support services have been taken care of. I am also evaluating other products as well because I want to work with the best.

I’m looking for an application that will allow me to seamlessly edit several types of code on several different servers without having to use a separate code editor, FTP program, web browser and Language reference material. To this date, I have been using three separate applications to accomplish my day-to-day work. I used FileZilla to copy files from a client’s web server to my desktop. I used Notepad++ to edit the code files. Finally, before using FileZilla again to upload the files back to the client’s server, I viewed the file in Firefox to see how it looks in a browser. That is if it is not a server-side language like PHP which I use the most. If I had to edit a PHP file, I had yet another couple of steps to perform because I’d have to upload the file to the server to view it and then repeat the whole entire process again if I had more changes to make to get it perfect. So I used FileZilla, Notepad++ and Firefox mostly up until now. I figure I could probably almost double my productivity with one good tool that does it all.

Technologies CodeLobster Supports

CodeLobster supports a wide range of technologies including:

  • PHP
  • HTML
  • JavaScript
  • CSS
  • SQL
  • MySQL
  • Version control systems such as SVN, Git etc.
  • CakePHP
  • CodeIgniter
  • WordPress
  • Drupal
  • Joomla
  • Facebook
  • jQuery
  • Smarty
  • Symfony
  • Yii

CodeLobster also has a very wide assortment of features including all the standard components you would expect in a code editor and many extras. I found a helpful built-in Help feature that also links to online help if you can’t find what you need in the built-in documentation. The online documentation is surprisingly complete for a newer product.

Installing CodeLobster

The installation went smoothly and was very easy and comprehensive. Simply download and click the set up file and the installer will guide you through the simple set up process. Here is the Download Link: http://www.codelobster.com/download.html

When I first installed CodeLobster, it allowed me to select what languages/technologies I wanted to install. I only deselected two that I knew for sure I would most likely never use. I figured if there was even a small chance that I might use one of the items listed, then I should leave it checked. That way I will be prepared in case I need that particular technology in the future.

Pros and Cons

Once I began using CodeLobster I noticed both good and bad points regarding the program. I loved how versatile the program was right out of the box. I did not like the way the word wrap feature worked(View/Word Wrap). It breaks up words rather than splitting lines by the nearest space. I’d prefer it to not break up words at all or at least do so in a more logical manner(by syllables with hyphens for example). From what I understand from reading the forums and talking with my contact, CodeLobster plans to add an option between soft and hard word-wrap. Hard wrap is how it is now and soft wrap would be a word-wrap technique that doesn’t break up words. I do hope they add it soon because it was one of the of the first things I noticed.

One of the first features I noticed and liked was the completely configurable hot-keys. You can configure any hot-key by going to Tools/Preferences/IDE/Hot keys. Another nice feature is the Find and Replace feature that is very much like that of Notepad++ including regular expression search and the ability to search and replace text in files, folders and sub-folders. This can be a huge time-saver for coders.

One of the first things I noticed and did not like was the lack of a decent spell checker. I know notepad++ has the option as a plugin, but not as a built-in feature. Either way would be great, but I think it should be a standard built-in feature. I realize that auto-complete helps with this, but not if you are writing a plain text file such as I am doing right now while writing this review. I talked to my contact at CodeLobster Software about this and he assured me that they plan to add a robust spell-checking feature in the near future. He mentioned that they plan on making several additions to the software and will be releasing future editions with new features and improvements ASAP. So, while CodeLobster may not have everything I would like it to have at the moment, I was assured that they are heading in the right direction with future expansion plans.

Another nice feature I also noticed right away was CodeLobster’s tool bars. The tool bars are completely configurable and have a nice drag and drop feature to move tool bar items around as you please. The same can be said for the man different windows that can be added or removed from the work area.

CodeLobster is a code editor first & foremost and it does a wonderful job at editing PHP code which is my code of choice. If you are looking for a word processor, CodeLobster probably won’t fit the bill, but it is a very robust code editor that can handle all of the languages I use for web development and several others.

CodeLobster’s plugin ability is great to have in a code editing program. The pro version of CodeLobster comes with many plugins that the free version does not include from what I understand, so I think the pro version is definitely worth the cost for those of you who work with frameworks such as WordPress, Joomla, CakePHP, CodeIgniter, etc. I currently own the Pro version and I am happy with its performance so far and will be much happier once some of the additions are made in the near future.

Even the free version would be great for coders who use many different coding languages regularly but don’t need the extra plugin abilities that require the pro version. As a full-time web developer, I mostly use PHP, HTML, CSS, JavaScript, WordPress and MySQL. I also occasionally use Joomla, XML, Perl, Python, Drupal, Smarty, Laravel, CakePHP and others, so I require the Pro version of CodeLobster myself. If you only use the most common languages such as PHP, HTML, CSS and JavaScript, you can probably do fine with the free version. Some of the things I require the Pro version for include WordPress support, Smarty, Laravel and CakePHP. Honestly there are to many features to list here. You should visit their web page at http://www.codelobster.com/details_phped.html to figure out which version is best for you. They also have a Lite version which you can read about on their site since I won’t be covering CodeLobster Lite here.

As I continue to evaluate the software I am finding there are more and more features that I like. As a web developer, I need a tool that allows me to quickly edit code, test it and upload it to the client’s server. So far, CodeLobster seems to be meeting my three main requirements quite well in most cases.

FTP Feature

CodeLobster’s FTP ability is a very powerful feature. The FTP feature allows you to set up as many FTP connections as you need. I was able to copy all of my client’s FTP connections from FileZilla into CodeLobster. Now I am able to click on a connection, edit a server file, preview it and upload it back to the server seamlessly from within a single application! This is huge for me because I used to use at least three different applications to do the same thing without CodeLobster. I can see that my work will get done a lot faster by using CodeLobster. In fact, I am already getting work done faster after only two days of using it.

The FTP feature is very functional, but for a guy like me who hates to read instructions, it took a little bit of fooling around using trial and error methods to get it set up for the first time with all of my client’s 20+ FTP connections and configuring basic settings. Everything I needed to accomplish my FTP tasks is in CodeLobster, but the FTP system does need some improvements. For example it gave me trouble when trying to connect to a SFTP connection. It worked great with all non-secure FTP connections however. As luck would have it, out of over 20 current clients I work with, only one uses SFTP rather than FTP, so I am unable to test it on other secure SFTP servers to see if the problem is just with this one server or not. Unfortunately this is one of my regular clients so it is going to be a problem for me. It did connect using SFTP, but had issues when trying to edit files on the server which I was able to do fine with regular FTP connections. I did bring this issue to the attention of my CodeLobster contact however and he assures me it will be looked into ASAP.

Regarding the GUI set-up for FTP, in my personal opinion, the way the windows are organized in the work area could have been done a little better. For example, when I use FTP, I have to go to Tools/FTP to open the explorer window that lists FTP connections. That alone will allow you to open your FTP connection but won’t allow you to see what’s going on. If there was an error and the only window you had open in your work area was the explorer window, you wouldn’t see that error. This is where I think it could have been done better. I would have programmed it so that when you open the FTP window, the output window opens along with it, right above it, similar to how FileZilla allows you to view console output. Of course this is just my opinion, it may not bother others and actually I am starting to get used to it so it doesn’t bother me as much as time passes.

Search Features

The “Find in Files”(Search/Find in Files…) feature is great for finding text in open files. It could be improved to allow file search on the local directory tree files as well, but it is sufficient the way it is. Also I love the regular expression search as I mentioned earlier.

Also, I often use the incremental search feature when I edit code. While I am glad it has this feature, a small nuisance for me is that the incremental search box is not persistent across different views. I think it would be nice if the incremental search box would stay at the bottom of all view tabs once it is opened. I don’t think it should close unless you manually close it. Again, this is just my preference, not a bug.

Nice-to-Have Features

One more thing I liked while test driving CodeLobster is that when editing .html and .css files I could hover over class names in the HTML or CSS code and it would show me the associated style declaration. Also when hovering over items in a .css file, it shows me information regarding the browser compatibility of the CSS code.

The HTML preview feature works very well. It is a built-in browser that shows the results of your code live without having to open a separate browser window. All you do is click on the “preview” tab. I did notice that sometimes you have to hit the refresh button to see your changes, but that is to be expected.

I also enjoyed the code formatting features very much. I tested them on an HTML file that I copied from an online web page. At first the HTML code was ran all together with no line breaks or indents. I simply went to the tool bar and clicked “Tools/Code Format/Format” and it formatted it perfectly. I am sure it will work with other supported languages equally well.

When you double-click on a variable name in the PHP editor, it highlights the variable and the dollar sign, so you can copy the whole thing and paste or search for it easily. Notepad++ wouldn’t include the dollar sign and it was a bother to me.

CodeLobster has what they call a “Map” feature(View/Windows/Map) that I’ve never seen before. It is basically a small window with a tiny view of the document you’re working on. It allows you to click anywhere in the Map to quickly jump to a section of the file that you need to work on. It is a great feature for working with large files.

Conclusion

I have concluded that CodeLobster will indeed fill a need in my current web development process. It is not yet developed enough to be the only tool I use simply because of that one SFTP connection it will not work correctly with. However I found that I can combine it with another tool, CyberDuck, as a work-around until the developers of CodeLobster work out the final kinks in the software and add some more nice-to-have type features such as spell-check and . In the end it still gets a thumbs up for all the wonderful features it has and for its robustness in general. Eventually I believe it will make the perfect all-in-one coding tool for my company. The other contender for my new all-in-one coding tool was CyberDuck and I can honestly say that CodeLobster has much more potential. CyberDuck is also in its early stages of development and it needs several improvements to be truly useful. CyberDuck fails in comparison to CodeLobster when it comes to Features. CodeLobster is truly made to be an all-in-one coding solution while CyberDuck is missing many of the necessary features to be a real competitor.

If you are interested in how I combined CodeLobster with CyberDuck to make up for CodeLobster’s short-coming when connecting by SFTP, I’ll quickly go over how to do it. Create a bookmark(that’s what CyberDuck calls their FTP/SFTP connections) in CyberDuck to the SFTP server. CyberDuck allows you to set it up so you can use your own code editor with it in a way that allows you to click on a file from a remote server and open it in that editor. Then when you save it in that editor(CodeLobster), it saves it to the server. That way I still have a seamless process even though I have to combine two tools to get what I truly want.