A simple framework for running WordPress unit and integration tests.

Overview

Touchstone

PHP

A modern wrapper around the official WordPress testsuite. It can be used to run both Unit and Integration tests.


Installation

Run the following command to install Touchstone in your project:

composer require sebkay/touchstone --dev

Usage

1.) Setup

Running the setup process downloads and installs both WordPress and the official WordPress test files in your temp directory.

Here's the command needed to run the setup process:

# Command
./vendor/bin/touchstone setup --db-host=[HOST] --db-name=[DATABASE NAME] --db-user=[DATABASE USER] --db-pass=[DATABASE PASSWORD] --skip-db-creation=[FALSE]

# Example
./vendor/bin/touchstone setup --db-host=127.0.0.1:8889 --db-name=touchstone_tests --db-user=root --db-pass=root --skip-db-creation=true

2.) Creating Tests

All your tests will need to be in the following structure from the root of your project:

tests/
    Unit/
        ExampleUnitTest.php
    Integration/
        ExampleIntegrationTest.php

All your Unit tests will need to extend the WPTS\Tests\UnitTest class and all your integrationt tests will need to extend the WPTS\Tests\IntegrationTest class.

Here's an example Unit test:



namespace WPTS\Tests\Unit;

class ExampleUnitTest extends UnitTest
{
    public function test_it_works()
    {
        $this->assertTrue(true);
    }
}

Here's an example Integration test:



namespace WPTS\Tests\Integration;

class ExampleIntegrationTest extends IntegrationTest
{
    public function test_post_title_was_added()
    {
        $post_id = $this->factory()->post->create([
            'post_title' => 'Example post title',
        ]);

        $post = \get_post($post_id);

        $this->assertSame('Example post title', $post->post_title);
    }
}

3.) Running Tests

You can run either all of your tests or a single testsuite with the following commands:

# Run all tests
./vendor/bin/touchstone test

# Run Unit tests
./vendor/bin/touchstone test --type=unit

# Run Integration tests
./vendor/bin/touchstone test --type=integration

Composer Scripts

You can create Composer scripts so you don't need to memorise the above commands.

To do so add the following to your composer.json file:

...
    "scripts": {
        "touchstone:setup": "./vendor/bin/touchstone setup --db-host=[HOST] --db-name=[DATABASE NAME] --db-user=[DATABASE USER] --db-pass=[DATABASE PASSWORD] --skip-db-creation=[FALSE]",
        "touchstone:test": "./vendor/bin/touchstone test",
        "touchstone:unit": "./vendor/bin/touchstone test --type=unit",
        "touchstone:integration": "./vendor/bin/touchstone test --type=integration"
    }
...

Then you can run the following from the command line:

# Run setup
composer touchstone:setup

# Run all tests
composer touchstone:test

# Run Unit tests
composer touchstone:unit

# Run Integration tests
composer touchstone:integration

Troubleshooting

Tests Won't Run

If you ever have problems running your tests, run the setup command. It's more than likely you've restarted your machine since the last time you ran the tests which deletes the WordPress test files. Re-running the setup process will usually fix the problem.

Why Does This Exist?

The official way of running the WordPress testsuite is horribly complicated and incredibly prone to user error.

Touchstone fixes both of those issues by making the process of creating and running tests easy.

Comments
  • Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5

    Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5

    Bumps guzzlehttp/guzzle from 7.4.4 to 7.4.5.

    Release notes

    Sourced from guzzlehttp/guzzle's releases.

    Release 7.4.5

    See change log for changes.

    Changelog

    Sourced from guzzlehttp/guzzle's changelog.

    7.4.5 - 2022-06-20

    • Fix change in port should be considered a change in origin
    • Fix CURLOPT_HTTPAUTH option not cleared on change of origin
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4

    Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4

    Bumps guzzlehttp/guzzle from 7.4.3 to 7.4.4.

    Release notes

    Sourced from guzzlehttp/guzzle's releases.

    Release 7.4.4

    See change log for changes.

    Changelog

    Sourced from guzzlehttp/guzzle's changelog.

    7.4.4 - 2022-06-09

    • Fix failure to strip Authorization header on HTTP downgrade
    • Fix failure to strip the Cookie header on change in host or HTTP downgrade
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump guzzlehttp/guzzle from 7.3.0 to 7.4.3

    Bump guzzlehttp/guzzle from 7.3.0 to 7.4.3

    Bumps guzzlehttp/guzzle from 7.3.0 to 7.4.3.

    Release notes

    Sourced from guzzlehttp/guzzle's releases.

    Release 7.4.3

    See change log for changes.

    Release 7.4.2

    See change log for changes.

    Release 7.4.1

    See change log for changes.

    Release 7.4.0

    See change log for changes.

    Changelog

    Sourced from guzzlehttp/guzzle's changelog.

    7.4.3 - 2022-05-25

    • Fix cross-domain cookie leakage

    7.4.2 - 2022-03-20

    Fixed

    • Remove curl auth on cross-domain redirects to align with the Authorization HTTP header
    • Reject non-HTTP schemes in StreamHandler
    • Set a default ssl.peer_name context in StreamHandler to allow force_ip_resolve

    7.4.1 - 2021-12-06

    Changed

    • Replaced implicit URI to string coercion #2946
    • Allow symfony/deprecation-contracts version 3 #2961

    Fixed

    • Only close curl handle if it's done #2950

    7.4.0 - 2021-10-18

    Added

    Fixed

    • Make sure we always call restore_error_handler() #2915
    • Fix progress parameter type compatibility between the cURL and stream handlers #2936
    • Throw InvalidArgumentException when an incorrect headers array is provided #2916, #2942

    Changed

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump guzzlehttp/psr7 from 2.0.0 to 2.2.1

    Bump guzzlehttp/psr7 from 2.0.0 to 2.2.1

    Bumps guzzlehttp/psr7 from 2.0.0 to 2.2.1.

    Release notes

    Sourced from guzzlehttp/psr7's releases.

    2.2.1

    See change log for changes.

    2.2.0

    See change log for changes.

    2.1.2

    See change log for changes.

    2.1.1

    See change log for changes.

    2.1.0

    See change log for changes.

    Changelog

    Sourced from guzzlehttp/psr7's changelog.

    2.2.1 - 2022-03-20

    Fixed

    • Correct header value validation

    2.2.0 - 2022-03-20

    Added

    • A more compressive list of mime types
    • Add JsonSerializable to Uri
    • Missing return types

    Fixed

    • Bug MultipartStream no uri metadata
    • Bug MultipartStream with filename for data:// streams
    • Fixed new line handling in MultipartStream
    • Reduced RAM usage when copying streams
    • Updated parsing in Header::normalize()

    2.1.1 - 2022-03-20

    Fixed

    • Validate header values properly

    2.1.0 - 2021-10-06

    Changed

    • Attempting to create a Uri object from a malformed URI will no longer throw a generic InvalidArgumentException, but rather a MalformedUriException, which inherits from the former for backwards compatibility. Callers relying on the exception being thrown to detect invalid URIs should catch the new exception.

    Fixed

    • Return null in caching stream size if remote size is null
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Add support for connecting via unix socket

    Add support for connecting via unix socket

    Will need to add an option to the Setup command, something like --db-socket.

    All need to add unix_socket= to the database string here somewhere:

    https://github.com/SebKay/touchstone/blob/1ab5858ba2b1914f4295199a47256d41e0b6ed81/src/Console/Commands/Setup.php#L155-L170

    opened by SebKay 0
  • Allow custom plugins and theme to be loaded for integration tests

    Allow custom plugins and theme to be loaded for integration tests

    When testing plugins or themes with functionality that relies on something like Advanced Custom Fields, it's useful for the user to be able to specify MU (must use) plugins somehow.

    This could also be a perfect time to introduce a Touchstone configuration file that could later be used for other types of configuration.

    Example for config:

    # touchstone.php
    return [
        'plugins' => [
            [
                'name' => 'Advanced Custom Fields',
                'file' => dirname(__FILE__) . '/bin/plugins/advanced-custom-fields-pro/acf.php',
            ],
        ],
        'theme' => [
            'root' => dirname(__FILE__) . '/../../themes/twentytwentyone',
        ],
    ];
    

    The above could then be loaded by Touchstone in the WP bootstrap file to load MU plugins and register the theme as the active one.

    opened by SebKay 0
Releases(2.2.0)
  • 2.2.0(Nov 21, 2022)

    What's Changed

    • Add support for "setup" config option which is a closure by @SebKay in https://github.com/SebKay/touchstone/pull/25

    Full Changelog: https://github.com/SebKay/touchstone/compare/2.1.0...2.2.0

    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Nov 21, 2022)

    What's Changed

    • Add support for loading consumer bootstrap file by @SebKay in https://github.com/SebKay/touchstone/pull/24

    Full Changelog: https://github.com/SebKay/touchstone/compare/2.0.0...2.1.0

    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Nov 21, 2022)

    What's Changed

    • Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 by @dependabot in https://github.com/SebKay/touchstone/pull/22
    • v2.0 by @SebKay in https://github.com/SebKay/touchstone/pull/23

    Full Changelog: https://github.com/SebKay/touchstone/compare/1.3.1...2.0.0

    Source code(tar.gz)
    Source code(zip)
  • 1.3.1(Jun 10, 2022)

    What's Changed

    • Bump guzzlehttp/psr7 from 2.0.0 to 2.2.1 by @dependabot in https://github.com/SebKay/touchstone/pull/19
    • Bump guzzlehttp/guzzle from 7.3.0 to 7.4.3 by @dependabot in https://github.com/SebKay/touchstone/pull/20
    • Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 by @dependabot in https://github.com/SebKay/touchstone/pull/21

    New Contributors

    • @dependabot made their first contribution in https://github.com/SebKay/touchstone/pull/19

    Full Changelog: https://github.com/SebKay/touchstone/compare/1.3.0...1.3.1

    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Jan 31, 2022)

    What's Changed

    • DB socket support by @SebKay in https://github.com/SebKay/touchstone/pull/18

    Full Changelog: https://github.com/SebKay/touchstone/compare/1.2.0...1.3.0

    Highlights

    Unix Socket Support

    If you need to connect to your test database via a unix socket, you can now pass the --db-socket option to the setup command.

    # Example
    ./vendor/bin/touchstone setup --db-host=127.0.0.1:8889 --db-socket="/path/to/mysqld.sock" --db-name=touchstone_tests --db-user=root --db-pass=root
    
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Jan 7, 2022)

    What's Changed

    • Improve configurable settings by @SebKay in https://github.com/SebKay/touchstone/pull/16

    Full Changelog: https://github.com/SebKay/touchstone/compare/1.1.0...1.2.0

    Highlights

    Plugins and Theme Configuration

    You can can now configure plugins and themes to use in tests, like so:

    # config.touchstone.php
    
    <?php
    
    return [
        'plugins' => [
            [
                'name' => 'Hello Dolly',
                'file' => dirname(__FILE__) . '/bin/plugins/hello-dolly/hello.php',
            ],
        ],
        'theme' => [
            'root' => dirname(__FILE__) . '/../../themes/twentytwentyone',
        ],
    ];
    
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Dec 9, 2021)

    What's Changed

    • Use namespaced constants by @szepeviktor in https://github.com/SebKay/touchstone/pull/14
    • Make configurable by @SebKay in https://github.com/SebKay/touchstone/pull/15

    New Contributors

    • @szepeviktor made their first contribution in https://github.com/SebKay/touchstone/pull/14

    Full Changelog: https://github.com/SebKay/touchstone/compare/1.0.1...1.1.0

    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-beta-3(Sep 30, 2021)

  • 1.0.0-beta-2(Sep 29, 2021)

    In this beta release:

    • New: Checks to make sure test files exist before running tests.
    • Improvement: Minor tweaks to readme documentation for set up and running tests.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-beta(Sep 25, 2021)

  • 0.3.1(Jun 23, 2021)

    In this release:

    • New: Added sebkay/wp-unit-test-stubs package to help with IDE class/function lookup when writing tests.
    • Fix: Added parent::setup() call to WPTS\Unit\UniteTest::setUp() method.
    • Fix: Fixed the touchstone bash script from only working when running database setup.
    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Jun 19, 2021)

    In this release:

    • Moved all separate bash scripts into one bash file.
    • Database details can now be passed as parameters when running setup, e.g. ./vendor/bin/touchstone setup DB_NAME DB_USER DB_PASSWORD DB_HOST
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Jun 17, 2021)

  • 0.1.0(Jun 17, 2021)

Owner
Seb Kay
Lead developer @Fhoke. I write code, most of the time. Usually using PHP and Vue.js ๐Ÿค™
Seb Kay
๐Ÿš€WordPress Plugin Boilerplate using modern web techs like TypeScript, SASS, and so on... on top of a local development environment with Docker and predefined GitLab CI for continous integration and deployment!

WP React Starter: WordPress React Boilerplate DEPRECATED: WP React Starter was a "research project" of devowl.io for the development of our WordPress

devowl.io GmbH 344 Jan 1, 2023
A curated list of Awesome WordPress Theme, Plugins and Framework development Resources and WordPress Communities.

Awesome WordPress A curated list of Awesome WordPress Theme, Plugins and Framework development Resources and WordPress Communities. Inspired by bayand

Dropndot Limited 91 Dec 26, 2022
A WordPress plugin to suspend WordPress sites automagically. Simple and lightweight, no annoying ads and fancy settings.

Suspend WP A WordPress plugin to suspend WordPress sites automagically. Simple and lightweight, no annoying ads and fancy settings. ?? Demo (coming so

Waren Gonzaga 3 Nov 15, 2021
Documents WordPress Classic Editor integration points and their Gutenberg equivalents

Gutenberg Migration Guide This repository documents WordPress Classic Editor customization points and their Gutenberg equivalents (if such exist). Its

Daniel Bachhuber 185 Nov 16, 2022
Simple WordPress plugin to learn how to understand WordPress Crons and the Action Scheduler library.

Simple WordPress plugin to learn how to understand WordPress Crons and the Action Scheduler library. Import Jamendo playlists with tracks in WordPress posts.

Pierre Saikali 3 Dec 7, 2022
๐Ÿš€ All-in-one enhancement plugin that improves WordPress & BuddyBoss integration.

=== Buddyboss Extended Add-on === Contributors: jcatama Donate link: https://www.paypal.me/jcatama Tags: buddyboss, buddypress, learndash, forums, gro

Albert Catama 1 Oct 12, 2022
๐Ÿš€ A distributed content delivery network (DCDN) integration plugin for wordpress

DCDN Engine - WordPress DCDN Plugin Simply integrate a Distributed Content Delivery Network (DCDN) into your WordPress site. Preview Plugin Installati

daqNext 6 Nov 30, 2022
WordPress & TypeScript. Simple starter template for WordPress projects

WordPress & TypeScript. Simple starter template for WordPress projects that want to use TypeScript in combination with @wordpress/scripts

Make it WorkPress 11 Sep 27, 2022
Simple WordPress plugin starter framework.

WordPress Plugin Starter This is the official WordPress plugin starter framework for Highfivery. The purpose behind it is to improve the quality of th

Highfivery LLC 5 Oct 27, 2022
A custom WordPress nav walker class to fully implement the Twitter Bootstrap 4.0+ navigation style (v3-branch available for Bootstrap 3) in a custom theme using the WordPress built in menu manager.

WP Bootstrap Navwalker This code in the main repo branch is undergoing a big shakeup to bring it in line with recent standards and to merge and test t

WP Bootstrap 3.3k Jan 5, 2023
The Pronamic WordPress Basecone plugin allows you to connect your WordPress installation to Basecone.

Pronamic WordPress Basecone The Pronamic WordPress Basecone plugin allows you to connect your WordPress installation to Basecone. Table of contents Au

Pronamic 1 Oct 19, 2021
Twenty Twenty-Two, the default WordPress theme that will launch with WordPress 5.9.

Twenty Twenty-Two Welcome to the development repository for the default theme that will launch with WordPress 5.9. About Twenty Twenty-Two is designed

null 414 Nov 28, 2022
Easy handle APlayer on WordPress. A shortcode for WordPress to using APlayer.

Description Easy handle APlayer on WordPress. A shortcode for WordPress to using APlayer. Support [audio] tag, compatible with AMP. Requirement WordPr

Karl Chen 24 Nov 3, 2022
WordPress plugin that lets you use Discourse as the community engine for a WordPress blog

WP Discourse Note: the wp-discourse plugin requires >= PHP-5.4.0. The WP Discourse plugin acts as an interface between your WordPress site and your Di

Discourse 497 Dec 10, 2022
A PHP client for Wordpress websites that closely implement the XML-RPC WordPress API

Wordpress XML-RPC PHP Client A PHP client for Wordpress websites that closely implement the XML-RPC WordPress API Created by Hieu Le MIT licensed. Cur

Hieu Le 112 Nov 10, 2022
Beauty and simple Wordpress video player plugin. Powerfull and lite in use.

Sonic Spectre Video Player Beauty and simple Wordpress video player plugin. Powerfull and lite in use. Quick Start: Download plugin from this repo and

Halcyon 1 Jan 4, 2022
Create custom WordPress routes and redirects, restrict access by roles and/or capabilities. Routes made simple

Create custom WordPress routes and redirects, restrict access by roles and/or capabilities. Routes made simple

Joan 9 Oct 10, 2022
Surge is a very simple and fast page caching plugin for WordPress.

=== Surge === Contributors: kovshenin Donate link: https://github.com/kovshenin/surge Tags: cache, performance, caching Requires at least: 5.7 Tested

Konstantin Kovshenin 122 Oct 24, 2022
A simple platform information plugin for WordPress. Shows you environment variables, PHP settings and more.

A simple platform information plugin for WordPress. Shows you environment variables, PHP settings and more.

New To Vaux 2 Sep 7, 2022