Social Planner: documentation

Social Planner is a WordPress plugin for automatic posting to social media accounts. It allows you to schedule announcements of your posts on social networks. At the moment, 4 providers are supported, but you can easily add a new one yourself.

This documentation will help you install and configure the plugin. Advanced developers can figure out how to extend functionality and write add-ons. If you find a bug here or in the plugin itself, feel free to open an issue on Github. I will try to answer as soon as possible.

Installation

Just search social-planner and activate the plugin from your admin dashboard. You can also manually upload the latest release to /wp-content/plugins and activate it.

Social Planner WordPress plugin installation
The easiest way is to install the plugin from the official catalog.

Due to the restrictions of the WordPress scheduling system, announcements on social networks may be delayed. To avoid this, it is advisable to configure the work of the system cron. If you are unable to implement it yourself, contact your hoster or system administrator. Read more here.

Configuration

Before using the plugin, you need to configure it. Immediately after installation, go to the plugin page. It is located in the Settings section. Here you need to add options for the required providers.

Pay attention to the Subtitle optional field on each provider. Fill it out if you want to use several accounts of the same social network or just for your convenience when scheduling.

Telegram

You can send messages to any group or channel. To do this, you need to create and add a special Bot to the required chat with the ability to send messages.

Write to the @BotFather in Telegram and create a new Bot. Follow the bot prompts, fill in all required fields and get an API Token.

Then you need to find out the group or channel ID. If the chat has a public link, then you can use its username (in the format @channelusername).
Otherwise you can write the message to @username_to_id_bot or use this guide. Note that chat ID can be negative.

Social Planner Telegram configuration
Example settings for Telegram.

If you have an access error when sending a message, try to check the correctness of the API Token and the chat ID, bypassing the plugin.

You can find full help on Telegram Bot API on the official website.

Facebook

With this plugin you can publish to Facebook Pages only. If you already have an application with permissions to publish to your page, you can immediately proceed to the stage of obtaining the Page ID.

Attention! Due to Facebook Restriction we can use the new Facebook App in HTTPS sites only.

Attention! You can publish to Facebook with the approved app only. So you need to submit the app for approval and it may take upto 3 months to get the approval. Facebook changes the rules of using its products often, so before starting the setup, read the latest guidelines on the help page.

To create a new Facebook application, go to the developer pages and create new one. You will need to select the type of your application.

Social Planner Facebook configuration
The easiest way to focus on Business integrations.

Enter the App Display Name and the contact Email. The purpose is for Yourself or your own business.

After the application is created, let's find out the ID of your page. Read how to do it on the Facebook help page.

Social Planner Facebook configuration
This is how the Page ID usually looks.

Now let's move on getting access token. For this you can use Graph API Explorer tool. In the right section select your Facebook App and in the User or Page field click Get page access token.

Now you need to request some required permissions:

Social Planner Facebook configuration
Ideally you should see something like this for your app and page.

Check that the access token is working by sending a POST request in the Graph Explorer tool of the {PageID}/feed. Getting an error The post is empty. Please enter a message to share means that the token is correct. If the error says about the need to obtain additional permissions, then you will have to pass the application verification. You can read more about this in the Facebook help guide.

The received token must be made long-term with Access Token Debuger. You can also get a permanent token using this guide.

Social Planner Facebook configuration
Receiving permanent token in Access Token Debugger.

After receiving the access token and Page ID, you can proceed to configuring the plugin.

Social Planner Facebook configuration
Example settings for Facebook.

VK.com

You can send messages both to your profile wall and to the community where you are an administrator.

Start by registering your app on the developer page. Enter something in the title field and choose Standalone app platform. Then confirm your action with phone call or push notification.

Social Planner VK.com configuration

Go to the Settings tab and copy the App ID. Insert this ID to the field below and push the button to generate your Token.

After you agree to the terms and conditions, the page will be redirected to oauth.vk.com domain. Your Token will be in access_token parameter.

Social Planner VK.com configuration

Please note that VK.com warns you not to transfer the Token to other sites. So keep it secret and only use it on trusted sites. Social Planner does not send any user data to remote servers.

Now you need to get the profile or community ID. You can find it in the links of your pages. Use a negative value to designate a community ID.

Social Planner VK.com configuration
You can see the ID in the url on the stats page for example.

Use access token and group ID on the plugin settings page.

Social Planner VK.com configuration
Example settings for VK.com.

Twitter

To set up this provider, you need to have full access to your Twitter account, as well as access to the attached Email in order to receive messages from support. If you already have a developer account and you created the application earlier, then skip directly to the last step.

Attention! Getting keys on Twitter can take patience and time. It is plugin independent and completely on your shoulders.

Log in to Twitter Developers and click on the Apply for a developer account button.

Now you need to fill out a form to obtain developer status. Fill in all fields and submit. You will receive a response in about 12 hours. Try to describe in as much detail how you will use the keys and on which specific site. A sample description is given below.

I am using a WordPress plugin Social Planner (https://wordpress.org/plugins/social-planner/) to publish posts automatically from blog to Twitter. The plugin requires Twitter App to publish posts from WordPress to Twitter. For this I must create an app and provide the app details such as API key, API secret, Access token and Access token secret. While creating a new post on my WordPress site, I can schedule the task to send this post to Twitter with custom excerpt or image. The detailed process is described in the documentation for the plugin (https://antonlukin.github.io/social-planner/#task-scheduling).

Social Planner Twitter configuration
Accept terms and conditions and submit the application.

Once the developer account gets approved, you will get a mail from Twitter. Then you can create a new app. In the create app section we can add the App Name, Application description, website url, and tell how the app is used. A sample description is given below.

I am using a WordPress plugin to publish posts automatically from blog to Twitter as a simple text message or or as text message with image. The plugin requires Twitter App to publish posts from WordPress to Twitter. For this I must create an app and provide the app details such as API key, API secret, Access token and Access token secret.

Review the terms and create the app. Go to the Keys and tokens section. Click on the Create button under Access token & access token secret section.

Now you can use the received keys to configure the plugin. Access level should be Read and write.

Social Planner Twitter configuration
Necessary Twitter access tokens.

You need to use all keys and tokens when configuring the plugin. Fields order on the settings page is the same as the order in Twitter.

Social Planner Twitter configuration
Example settings for Twitter.

OK.ru

With this plugin you can publish to OK.ru groups only. If you already have an application with permissions to publish to your group, you can immediately proceed to the configuring the plugin.

Attention! You can publish to OK.ru groups with the approved app only. So you need to submit the app for approval and request the necessary permissions. This process usually takes 3 days, but the time frame may increase.

Log in to OK.ru and go to the develpment page for creating a new application.

Fill in the settings fields. Select the type-custom application and save it. Immediately after that, a letter should come to your mail indicating your application credentials.

Social Planner OK.ru configuration
Do not forget to fill in all the required fields and save the application settings.

Now you need to request additional permissions for your app in order to be able to post. To do this, send an email to api-support@ok.ru with the ID of your application and a detailed description of the tasks for which you need permissions. A sample description is given below. Do not forget to replace values in brackets.

Здравствуйте, прошу предоставить разрешения на создание топиков в моем сообществе в Одноклассниках [link to your group] для моего приложения с ID [application ID from email]. Публикация будет выполняться с моего сайта [link to your WordPress site] с помощью плагина Social Planner: https://wordpress.org/plugins/social-planner. Требуемые разрешения: GROUP_CONTENT, PHOTO_CONTENT. Для других целей это приложение использоваться не будет.

You will receive an answer in about 3 days. If you have not received the letter, check the application settings, you may have already been granted permissions. You can do this by following the link and selecting the application you need.

Social Planner OK.ru configuration
This is how the screen will look after the OK.ru support team gives you permissions.

New fields GROUP_CONTENT and PHOTO_CONTENT will appear in the access rights of your application. Now you can proceed to configuring the plugin. First of all, get an access token. Copy both access token and secret session key to the plugin settings.

You can find the Application public key at the top of your app's settings page or in the first letter from OK.ru support team. The Group ID value can be viewed in the link address of your group or on its settings page.

Social Planner OK.ru configuration
Example settings for OK.ru.

Task scheduling

Once you have configured the plugin, you can start scheduling social media announcements. Go to the post edit page and scroll to the end of the screen. There you will see the metabox for scheduling.

Social Planner task scheduling
This is how the metabox you need looks like.

Choose the time at which you want to schedule the release of the announcement, social networks and enter the text. If you want to attach a poster, click on the big button with a plus sign.

To delete the selected poster, click on the image again.

Some social networks allow you to generate a preview of the link and load the poster and other opengraph tags into the post. You can disable this by enabling the checkbox on the bottom right. Experiment with this behavior on test accounts to decide how you want to display links.

After filling in the meta box fields, update or publish the entry. If the time was chosen for the announcement, then the task will be automatically scheduled.

If the publication date of the post itself is later than the date of the task, then the announcement will be automatically rescheduled to the post release date.

Social Planner task scheduling
Scheduled task.

After publishing, you will be able to see links to published posts in place of providers' checkboxes. Or errors in the same place in case of problems with sending.

FAQ

This section describes common problems when using the plugin and how to solve them. If you haven't found your question, it is best to ask it in the official repository on Github.

Can I avoid storing social networks tokens in the database?

Yes, you can define a constant SOCIAL_PLANNER_PROVIDERS with your settings. The best place for this constant is in the file wp-config.php or in the functions.php.

Show me an example

You should define provider key as {network_name}-{index}, where index is something alphanumeric and unique. You can see correct network name and all availible network fields in source code.

                
                    define( 'SOCIAL_PLANNER_PROVIDERS', array(
                        'vk-1' => array(
                            'token' => 'token',
                            'group' => '-123',
                        ),

                        'telegram-1' => array(
                            'token' => '123:token',
                            'group' => '123',
                        ),

                        'facebook-1' => array(
                            'token' => 'token',
                            'group' => '123',
                            'title' => 'Facebook',
                        ),

                        'twitter-1' => array(
                            'consumer_key'    => 'key',
                            'consumer_secret' => 'secret',
                            'access_token'    => 'token',
                            'access_secret'   => 'secret'
                        )
                    ) );
                
            

How can I show the settings page only to some users?

You can use filter social_planner_hide_settings.

Show me an example
                
                    function my_hide_settings( $hide_settings ) {
                        $user = wp_get_current_user();

                        if ( empty( $user->user_login ) || 'admin' !== $user->user_login ) {
                            $hide_settings = true;
                        }

                        return $hide_settings;
                    }

                    add_filter( 'social_planner_hide_settings', 'my_hide_settings' );
                
            

Can I use html in the summary field when scheduling a new task?

You can use only Markdown **text here** for bold and __text here__ for italic to beatify Telegram announcements.

How to hide the metabox for custom post types?

Plugin shows metabox for all public post types except attachments. You can override this behavior with the social_planner_post_types filter.

Show me an example
                
                    function my_post_types( $post_types ) {
                        // Remove metabox from pages.
                        foreach ( $post_types as $i => $name ) {
                            if ( 'page' === $name ) {
                                unset( $post_types[ $i ] );
                            }
                        }

                        return $post_types;
                    }

                    add_filter( 'social_planner_post_types', 'my_post_types' );
                
            

What happens when you delete the plugin?

By default, when uninstalling the plugin through the admin panel, all database options are deleted, including data on submitted tasks. If you want to keep them uninstall the plugin indirectly via the filesystem.

Custom providers

Only 4 social networks are available for posting now. Some more are likely to be added soon, but until that happens, you might want to write your own extension. And it's not that hard to do.

You need to create a special social network class and connect it to the plugin. There is an Example of a non-existent network in below. Copy it and replace the information in the methods.

Example network class
                
                    <?php

                    class My_Network_Example {
                        /**
                        * Unique network slug.
                        * Use latin alphanumeric characters and underscore only.
                        */
                        const NETWORK_NAME = 'example';

                        /**
                        * Return human-readable network label
                        */
                        public static function get_label() {
                            return 'Example';
                        }

                        /**
                        * Return network required settings fields
                        */
                        public static function get_fields() {
                            $fields = array(
                                'token' => array(
                                    'label'       => 'Token',
                                    'placeholder' => '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11',
                                    'required'    => true,
                                ),

                                'group' => array(
                                    'label'    => 'Group ID',
                                    'required' => true,
                                ),

                                'title' => array(
                                    'label' => 'Subtitle',
                                    'hint'  => 'Optional field.'
                                ),
                            );

                            return $fields;
                        }

                        /**
                        * Send message method
                        *
                        * @param array $message  Message data.
                        * @param array $settings Settings array from options.
                        */
                        public static function send_message( $message, $settings ) {
                            // You should write this sending method using $message and $settings.
                            $response = self::my_sending_method( $message, $settings );

                            // If something went wrong you should return WP_Error.
                            if ( empty( $response ) ) {
                                return new WP_Error( 'sending', 'Example sending error' );
                            }

                            // If it is ok, you should return a message link or ID.
                            return 'https://example.com/' . $response;
                        }
                
            

Your class must provide NETWORK_NAME constant and public static send_message method. You can see how the other classes of social networks of the plugin are implemented in the repository.

Place your class file in your theme or plugin and connect with filter:

            
                function add_example_network( $networks ) {
                    $networks['My_Network_Example'] = get_template_directory() . '/inc/class-network-example.php';

                    return $networks;
                }

                // This filter must execute before the `init` event.
                add_filter( 'social_planner_networks', 'add_example_network' );
            
        

That's all you need. Now check if the new provider has appeared on the Settings page.

Actions and filters

Social Planner provides developers with a large number of hooks that can be used to change the behavior of the plugin. Put the hook code in functions.php file of your theme or in your plugin.

social_planner_dashboard_before

Use this action to add something before the dashboard widget.

Note that the content inside the widget is composed with js and if you want to change it, you need to use the social_planner_dashboard_object filter.

                
                    function my_dashboard_before() {
                        echo 'This text will be displayed in the dashboard widget';
                    }

                    add_action( 'social_planner_dashboard_before', 'my_dashboard_before' );
                
            
social_planner_metabox_before

Use this action to add something before metabox in post edition screen.

Note that the content inside the metabox is composed with js and if you want to change it, you need to use the social_planner_metabox_object filter.

                
                    function my_metabox_before() {
                        echo 'This text will be displayed in the metabox';
                    }

                    add_action( 'social_planner_metabox_before', 'my_metabox_before' );
                
            
social_planner_task_sent

Use this action to do something with the task results right after sending.

                
                    /**
                     * Fires right after task sent.
                     *
                     * @param array  $results List of results after task sending.
                     * @param string $key     Task key.
                     * @param int    $post_id Post ID.
                     */
                    function my_task_sent( $results, $key, $post_id ) {
                        my_save_results( $results, $key );
                    }

                    add_action( 'social_planner_task_sent', 'my_task_sent', 10, 3 );
                
            
social_planner_networks

The filter is used to add a custom social network for sending announcements. Read more about this in the Custom providers section of this documentation.

social_planner_network_label

You can change network labels in the metabox and settings with this filter.

                
                    /**
                     * @param string $label Network label.
                     * @param string $class Current network class.
                     */
                    function my_network_label( $label, $class ) {
                        if ( 'Social_Planner\Network_Telegram' === $class ) {
                            $label = 'My custom ' . $label;
                        }

                        return $label;
                    }

                    add_filter( 'social_planner_network_label', 'my_network_label', 10, 2 );
                
            
social_planner_time_format

You can change the date format used by the plugin with this filter. The default is the format from the WordPress settings. Read more in codex section.

                
                    /**
                     * @param string $format Datetime format.
                     */
                    function my_time_format( $format ) {
                        return 'F j, Y h:i';
                    }

                    add_filter( 'social_planner_time_format', 'my_time_format' );
                
            
social_planner_hide_dashboard

You can use this filter to hide the dashboard from some users or roles.

                
                    /**
                     * @param bool $hide_dashboard Set true to hide dashboard.
                     */
                    function my_hide_dashboard( $hide_dashboard ) {
                        if ( ! current_user_can( 'manage_options' ) ) {
                            $hide_dashboard = true;
                        }

                        return $hide_dashboard;
                    }

                    add_filter( 'social_planner_hide_dashboard', 'my_hide_dashboard' );
                
            
social_planner_dashboard_object

This filter allows you to manage an object with the dashboard settings.

                
                    /**
                     * @param array $object Array of dashboard script object.
                     */
                    function my_dashboard_object( $object ) {
                        $object['tasks'] = my_dashboard_handler( 'tasks' );

                        return $object;
                    }

                    add_filter( 'social_planner_dashboard_object', 'my_dashboard_object' );
                
            
social_planner_sanitize_tasks

You can update tasks right after sanitization on the metabox saving with this filter.

                
                    /**
                     * @param array $sanitized List of tasks after sanitization.
                     * @param array $tasks     List of tasks before sanitization.
                     */
                    function my_sanitize_tasks( $sanitized_tasks, $tasks ) {
                        return my_tasks_sanitization( $tasks );
                    }

                    add_filter( 'social_planner_sanitize_tasks', 'my_sanitize_tasks', 10, 2 );
                
            
social_planner_get_tasks

This filter allows you to change the array with tasks during the get_post_meta request.

                
                    /**
                     * @param array $tasks   List of tasks from post meta.
                     * @param int   $post_id Post ID.
                     */
                    function my_get_tasks( $tasks, $post_id ) {
                        if ( 0 === $post_id ) {
                            $tasks = array();
                        }

                        return $tasks;
                    }

                    add_filter( 'social_planner_get_tasks', 'my_get_tasks', 10, 2 );
                
            
social_planner_update_tasks

This filter allows you to change the array with tasks right before the update_post_meta request.

                
                    /**
                     * @param array  $tasks   List of tasks from post meta.
                     * @param int    $post_id Post ID.
                     */
                    function my_update_tasks( $tasks, $post_id ) {
                        if ( 0 === $post_id ) {
                            $tasks = array();
                        }

                        return $tasks;
                    }

                    add_filter( 'social_planner_update_tasks', 'my_update_tasks', 10, 2 );
                
            
social_planner_get_results

This filter allows you to change the array with results during the get_post_meta request.

                
                    /**
                     * @param array $results List of results from post meta.
                     * @param int   $post_id Post ID.
                     */
                    function my_get_results( $results, $post_id ) {
                        if ( 0 === $post_id ) {
                            $results = array();
                        }

                        return $results;
                    }

                    add_filter( 'social_planner_get_results', 'my_get_results', 10, 2 );
                
            
social_planner_update_results

This filter allows you to change the array with results right before the update_post_meta request.

                
                    /**
                     * @param array $results List of tasks from post meta.
                     * @param int   $post_id Post ID.
                     */
                    function my_update_results( $results, $post_id ) {
                        if ( 0 === $post_id ) {
                            $results = array();
                        }

                        return $results;
                    }

                    add_filter( 'social_planner_update_results', 'my_update_results', 10, 2 );
                
            
social_planner_metabox_object

This filter allows you to manage an object with the metabox settings.

                
                    /**
                     * @param array $object  Array of metabox script object.
                     * @param int   $post_id Current post ID.
                     */
                    function my_metabox_object( $object, $post_id ) {
                        $object = array(
                            'meta'      => my_metabox_handler( 'meta' ),
                            'action'    => my_metabox_handler( 'action' ),
                            'nonce'     => my_metabox_handler( 'nonce' ),
                            'tasks'     => my_metabox_handler( 'tasks' ),
                            'results'   => my_metabox_handler( 'results' ),
                            'offset'    => my_metabox_handler( 'offset' ),
                            'calendar'  => my_metabox_handler( 'calendar' ),
                            'providers' => my_metabox_handler( 'providers' ),
                            'schedules' => my_metabox_handler( 'schedules' ),
                        );

                        return $object;
                    }

                    add_filter( 'social_planner_metabox_object', 'my_metabox_object', 10, 2 );
                
            
social_planner_hide_metabox

You can use this filter to hide the metabox from some users or roles.

                
                    /**
                     * @param bool $hide_metabox Set true to hide metabox.
                     */
                     function my_hide_metabox( $hide_metabox ) {
                        if ( ! current_user_can( 'manage_options' ) ) {
                            $hide_metabox = true;
                        }

                        return $hide_metabox;
                    }

                    add_filter( 'social_planner_hide_metabox', 'my_hide_metabox' );
                
            
social_planner_post_types

By default, the plugin shows the metabox for all public post types except attachments. You can override this behavior with this filter.

                
                    /**
                     * @param array $post_types Array of post types for which the metabox is displayed.
                     */
                    function my_post_types( $post_types ) {
                        $post_types[] = 'my_hidden_type';

                        foreach ( $post_types as $i => $name ) {
                            if ( 'page' === $name ) {
                                unset( $post_types[ $i ] );
                            }
                        }

                        return $post_types;
                    }

                    add_filter( 'social_planner_post_types', 'my_post_types' );
                
            
social_planner_calendar_days

This filter manages the number of future days in schedule select box.

                
                    /**
                     * @param int $days_count Number of days in task calendar select box.
                     */
                    function my_calendar_days( $days_number ) {
                        return 7;
                    }

                    add_filter( 'social_planner_calendar_days', 'my_calendar_days' );
                
            
social_planner_time_offset

This filter sets a time offset. By default, it is a value between UTC and WordPress time in seconds. This offset is used in admin-side metabox to choose the time for planning.

                
                    /**
                     * @param int $offset Time offset in seconds from UTC.
                     */
                    function my_time_offset( $offset ) {
                        $offset = timezone_offset_get( wp_timezone(), date_create( 'now' ) );

                        return $offset;
                    }

                    add_filter( 'social_planner_time_offset', 'my_time_offset' );
                
            
social_planner_post_statuses

This filter sets post statuses that can be scheduled. By default, we can schedule only posts with statuses 'publish' or 'future'. You can change this behavior.

                
                    /**
                     * @param array $statuses List of post statuses.
                     */
                    function my_post_statuses( $statuses ) {
                        $statuses = array( 'private', 'pending', 'future', 'publish' );

                        return $statuses;
                    }

                    add_filter( 'social_planner_post_statuses', 'my_post_statuses' );
                
            
social_poster_prepare_message

This filter allows updating message array right before network sending method execution. This is a great place, for example, to add some text to the excerpt field or replace a post link.

                
                    /**
                     * @param array  $message Sending message data.
                     * @param string $target  Target provider name.
                     * @param array  $task    Scheduled task data.
                     */
                    function my_prepare_message( $message, $target, $task ) {
                        $message['link'] = my_message_link( $message['post_id'] );

                        if ( ! empty( $message['excerpt'] ) ) {
                            $message['excerpt'] = $message['excerpt'] . "\n\n" . '#some_hashtag';
                        }

                        return $message;
                    }

                    add_filter( 'social_poster_prepare_message', 'my_prepare_message', 10, 3 );
                
            
social_planner_hide_settings

You can use this filter to hide settings page from some users or roles.

                
                    /**
                     * @param bool $hide_settings Set true to hide settings page.
                     */
                     function my_hide_settings( $hide_settings ) {
                        $user = wp_get_current_user();

                        if ( empty( $user->user_login ) || 'admin' !== $user->user_login ) {
                            $hide_settings = true;
                        }

                        return $hide_settings;
                    }

                    add_filter( 'social_planner_hide_settings', 'my_hide_settings' );
                
            
social_planner_get_providers

You can filter the list of providers from options. It can be handy to use options bypassing the settings page.

                
                    /**
                     * @param array $providers List of provders options.
                     */
                     function my_get_providers( $providers ) {
                        $providers = array(
                            'facebook-1' => array(
                                'token' => 'token',
                                'group' => 'group',
                            ),
                        );

                        return $providers;
                    }

                    add_filter( 'social_planner_get_providers', 'my_get_providers' );
                
            
social_planner_settings_object

This filter allows you to manage settings script object.

                
                    /**
                     * @param array $object Array of settings script object.
                     */
                    function my_settings_object( $object ) {
                        $object = array(
                            'option'    => my_settings_handler( 'option' ),
                            'networks'  => my_settings_handler( 'networks' ),
                            'providers' => my_settings_handler( 'providers' ),
                        );

                        return $object;
                    }

                    add_filter( 'social_planner_settings_object', 'my_settings_object' );
                
            
social_planner_prepare_excerpt

The last chance to filter message excerpt before sending to social network account.

                
                    /**
                     * @param string $excerpt Message excerpt.
                     * @param array  $message Original message array.
                     * @param string $network Network name.
                     */
                    function my_prepare_excerpt( $excerpt, $message, $network ) {
                        if ( empty( $excerpt ) ) {
                            $excerpt = get_the_title( $message[ $post_id ] );
                        }

                        return $message;
                    }

                    add_filter( 'social_planner_prepare_excerpt', 'my_prepare_excerpt', 10, 3 );
                
            

Donation

The development of this plugin is carried out by the author in his free time and at his own expense. Any your help is greatly appreciated. Use a convenient payment system to send money.

Leave a link to your profile in the payment description and I can provide you with priority support.

Contribution

The best way to help the project is to report a bug or add some new functionality. All project code is stored on Github. You can also open there an issue or send a pull reguest.

To start development follow the instructions:

  1. Fork the repository.
  2. Install dependencies with yarn and composer update.
  3. Add some code.
  4. Check the syntax according to WordPress Coding Standards.
  5. Write tests if needed.
  6. Build assets with gulp build command.
  7. Increase plugin version in package.json and social-planner.php files.
  8. Create a pull request.

A great opportunity to help a project is to write a new provider class. You can read more about this in the section Custom providers.