Thank you for thinking about contributing to Orbit Fox! All sorts of contributions are welcomed.
Orbit Fox is licensed under the GPLv2+, and all contributions to Orbit Fox will be released under the GPLv2+ license. By contributing to this repository, you agree to release your contribution under the GPLv2+ license.
You need a WordPress Environment to run the plugin on. This project needs a lot of different packages to be installed before you can start coding, but we've made the process easier with Docker.
The quickest way to get up and running is to use the provided Docker setup which takes care of setting up the environment for you within seconds. Install docker and docker-compose by following the most recent instructions on the Docker site.
Once Docker is installed, fork Orbit Fox repository. Clone your fork of this project and enter the working directory:
git clone http://github.com/YOUR-USERNAME/themeisle-companion/
cd themeisle-companion
Once inside the folder, you can run the following command to start your Docker container:
docker-compose up -d
This will make your WordPress instance up and running at http://localhost:8888
-
If you want to use a different port for your environment, then you can change it from docker-compose.yml file.
-
If you're developing themes, or core WordPress functionality alongside Orbit Fox, you can make the WordPress files accessible in
/themeisle-companion/wordpress/
folder in your home directory. -
If you want bash access to your environment, you can use the following command to find the ID of your Docker container:
docker ps
And then you can get bash access with the following command:
docker exec -it <ID OF YOUR CONTAINER> bash
If you want to stop your Docker container, for the time being, you can use the following command:
docker-compose stop
Moreover, if you want to delete your Docker instance, you can use:
docker-compose down
Once you've bash access of your WordPress container, you need to enter your Orbit Fox directory with:
cd /var/www/html/wp-content/plugins/themeisle-companion/
Now, we need to install npm
and composer
dependencies with the following commands:
npm install
composer install
Now you can start making your changes to the plugin.
We use Grunt for automating many tasks, such as compiling Sass to CSS, PHP Code Sniffer, and more.
Once you have made your changes, you can run Grunt tasks by running:
grunt local
It will take some time to finish all the tasks. If there are any issues found in PHP or JavaScript, it gives you a detailed log inside /logs/
folder of the plugin. Fix those issues and run grunt local
again until it finishes without an error.
To run PHP_CodeSniffer, run composer lint
. This will run the WordPress Coding Standards checks.
To fix automatically fixable issues, run composer format
.
Tests for PHP use PHPUnit as the testing framework, which is run with:
phpunit
Code must follow WordPress Coding standards, which is checked when running tests (more on this below).
When outputting data, escape it using WordPress' escaping functions such as esc_html()
, esc_attr__()
, wp_kses()
, wp_kses_post()
.
When reading user input, sanitize it using WordPress' sanitization functions such as sanitize_text_field()
, sanitize_textarea_field()
.
When writing to the database, prepare database queries using $wpdb->prepare()
Never trust user input. Sanitize it.
Make use of WordPress nonces for saving form submitted data.
Coding standards will catch any sanitization, escaping or database queries that aren't prepared.
There are different types of tests that can be written:
- Acceptance Tests: Test as a non-technical user in the web browser.
- Functional Tests: Test the framework (WordPress).
- Integration Tests: Test code modules in the context of a WordPress website.
- Unit Tests: Test single PHP classes or functions in isolation.
- WordPress Unit Tests: Test single PHP classes or functions in isolation, with WordPress functions and classes loaded.
There is no definitive / hard guide, as a test can typically overlap into different types (such as Acceptance and Functional).
The most important thing is that you have a test for something. If in doubt, an Acceptance Test will suffice.
An acceptance test is a test that simulates a user interacting with the Plugin or Theme in a web browser. Refer to Writing an End-to-End Test below.
To write an End-to-End test, create a new file under e2e-tests/specs
with the name of the spec or functionality you are testing, and add .spec.test
to the file name.
E.g. for e2e-tests/specs/checkout.spec.test.js
, the test file should be checkout.spec.test.js
.
For more information on writing End-to-End tests, refer to the Playwright documentation.
You can check End-to-End README for more details.
WordPress Unit tests provide testing of Plugin/Theme specific functions and/or classes, typically to assert that they perform as expected by a developer. This is primarily useful for testing our API class, and confirming that any Plugin registered filters return the correct data.
To create a new WordPress Unit Test, create a new file under tests/php/unit
with the name of the class you are testing, and the suffix Test
.
The filename should be in lower-case-with-dash
, and the class name should be in CamelCase
.
E.g. for tests/php/unit/class-api-test.php
, the test class should be class APITest extends \PHPUnit\Framework\TestCase
.
<?php
class APITest extends \PHPUnit\Framework\TestCase
{
/**
* @var \WpunitTester
*/
protected $tester;
public function setUp(): void
{
// Before...
parent::setUp();
// Your set up methods here.
}
public function tearDown(): void
{
// Your tear down methods here.
// Then...
parent::tearDown();
}
// Tests
public function test_it_works()
{
$post = static::factory()->post->create_and_get();
$this->assertInstanceOf(\WP_Post::class, $post);
}
}
Once you have written your code and test(s), run the tests to make sure there are no errors.
./vendor/bin/phpunit tests/php/unit/class-api-test.php
Any errors should be corrected by making applicable code or test changes.
In the Plugin's or Theme's directory, run the following command to run PHP_CodeSniffer, which will check the code meets Coding Standards
as defined in the phpcs.tests.xml
configuration:
composer run lint
--standard=phpcs.tests.xml
tells PHP CodeSniffer to use the Coding Standards rules / configuration defined in phpcs.tests.xml
.
These differ slightly from WordPress' Coding Standards, to ensure that writing tests isn't a laborious task, whilst maintain consistency
in test coding style.
-v
produces verbose output
-s
specifies the precise rule that failed
Any errors should be corrected by either:
- making applicable code changes
- running
composer run format
to automatically fix coding standards
Need to change the PHP or WordPress coding standard rules applied? Either:
- ignore a rule in the affected code, by adding
phpcs:ignore {rule}
, where {rule} is the given rule that failed in the above output. - edit the phpcs.tests.xml file.
A good workflow for pull requests to follow is listed below:
- Fork Orbit Fox repository
- Clone forked repository
- Use development branch for your changes, or create a new branch from development branch.
- Setup environment
- Make code changes
- Run Grunt tasks and PHPUnit tests.
- Push branch to forked repository
- Submit Pull Request
ThemeIsle team takes security bugs very seriously. Do not report potential security vulnerabilities here. Email them privately to our team at [email protected]
We use GitHub issues for tracking bugs. When filing an issue, make sure to answer these questions:
- What version of Orbit Fox are you using?
- What version of WordPress are you using are you using?
- What did you do?
- What did you expect to see?
- What did you see instead?
Explain the problem and include additional details to help maintainers reproduce the problem:
- Use a clear and descriptive title for the issue to identify the problem.
- Describe the exact steps which reproduce the problem in as many details as possible, including screenshots if needed.
You don't need to be a developer to contribute to Orbit Fox. You can also contribute to the project by translating it to your language. You can find your locale here.
Language packs are automatically generated once 95% of the plugin's strings are translated and approved for a locale.