This post is part of the ClassicPress Plugin Development series in which I am going to look at both best practice for developing plugins and how I approach some requirements as well as some of the functions I commonly use.
In the last post in this series, on whether to use namespaces, I discussed whether they should be used or not and noted that I do not currently use them, but am debating whether I should.
At present, the azrcrv_tt_post_tweet
function in my To Twitter plugin is called from a few other plugins in order to send a tweet; the function calls looks like this:
$tweet_result = azrcrv_tt_post_tweet($parameters);
This calls this function:
function azrcrv_tt_post_tweet($parameters){
If I was to update my plugins to use namespaces, in the To Twitter plugin a namespace would be added to the top of the PHP file (only the opening PHP tags and any comments should be before the namespace declaration). If I do make this change, I would use a developer and plugin specific namespace:
namespace azurecurve\ToTwitter;
The function to post the tweet, and all other functions, could then be renamed to remove the current developer and plugin specific prefixes thusly:
function post_tweet($parameters){
The other plugins which call this function, would need the function call to be amended to include the namespace:
$tweet_result = \azurecurve\ToTwitter\post_tweet($parameters);
With namespaces, it is possible to use a function name which matches that in the global namespace. For example, the get_option
function is a standard ClassicPress function used to get the options for a plugin. I can create a function with the same name in a plugin without a conflict.
Calling the below will call the function in the plugin:
$options = get_option('azrcrv-tt');
To call the standard ClassicPress version in the global namespace I would prefix the function call with a \
:
$options = \get_option('azrcrv-tt');
The final point to handle, is if you are using a ClassicPress hook such as add_action
you are passing a string which will be executed in the global namespace so you need to pass the namespace of your plugin as part of the hook:
add_action('admin_menu', 'azurecurve\ToTwitter\create_admin_menu');
There is a predefined PHP constant available which you can use to avoid putting your namespace in many parts of your plugin; this can be useful in future if you need to change your namespace, as you then ony need to change the declaration at the top of the plugin:
add_action('admin_menu', __NAMESPACE__.'\create_admin_menu');
The same principles would apply PHP classes as well, but as I said in the coding paradigms blog post, I am not developing using object oriented programming and so am not covering classes.