Adds `tax_query` support to postObject connection queries using WP_Query

Overview

WPGraphQL Tax Query

This plugin adds Tax_Query support to the WP GraphQL Plugin for postObject query args (WP_Query).

Pre-req's

Using this plugin requires having the WPGraphQL plugin installed and activated. (version 0.0.15 or newer)

Activating / Using

Activate the plugin like you would any other WordPress plugin.

Once the plugin is active, the taxQuery argument will be available to any post object connectionQuery (posts, pages, custom post types, etc).

Example Query

Below is an example Query using the taxQuery input on a posts query. (Go ahead and check things out in GraphiQL)

This will find posts that are in the category "graphql" OR tagged with "wordpress".

query{
  posts(
    where: {
      taxQuery: {
        relation: OR,
        taxArray: [
          {
            terms: ["graphql"],
            taxonomy: CATEGORY,
            operator: IN,
            field: SLUG
          },
          {
            terms: ["wordpress"],
            taxonomy: POST_TAG,
            operator: IN,
            field: SLUG
          }
        ]
      }
  	}
  ){
    edges{
      cursor
      node{
        id
        postId
        link
        date
      }
    }
  }
}

The same query in PHP using WP_Query would look like:

$args = [
    'tax_query' => [
        'relation' => 'OR',
        [
            'terms' => ['graphql'],
            'taxonomy' => 'category',
            'operator' => 'IN',
            'field' => 'slug',
        ],
        [
            'terms' => ['wordpress'],
            'taxonomy' => 'post_tag',
            'operator' => 'IN',
            'field' => 'slug',
        ],
    ],
];

new WP_Query( $args );
Comments
  • LoadKeys error on query. Successful results.

    LoadKeys error on query. Successful results.

    Error:

    "debugMessage": "Method WPGraphQL\\Data\\Loader\\PostObjectLoader::loadKeys is expected to return array, but it threw: No item was found with ID 1218",
          "message": "Internal server error",
          "category": "internal",
          "locations": [
            {
              "line": 24,
              "column": 17
            }
          ],
          "path": [
            "apples",
            "edges",
            5,
            "node",
            "featuredImage"
          ]
        },
    

    Query:

    query ($uri: String){
        apples (
            where: {
                taxQuery: {
                    taxArray: [
                        {
                            terms: [$uri],
                            taxonomy: KEYWORD,
                            operator: IN,
                            field: SLUG
                        }
                    ]
                }
            }
        ){
            edges{
                cursor
                node {
                    appleId
                    title ... (more fields)
    

    So I get results in the data part of result, but inthe error area of result I'm given the LoadKey error for each result. Not sure whats wrong here.

    opened by joseffb-mla 30
  • taxQuery not available in schema after activating plugin

    taxQuery not available in schema after activating plugin

    Is this plugin still working? With both wp-graphql and wp-graphql-tax-query activated, taxQuery does not appear to be available in the schema. I have flushed permalinks as well.

    opened by fullsteamlabs 7
  • Update to work with WPGraphQL v1.6.12+ (BREAKING)

    Update to work with WPGraphQL v1.6.12+ (BREAKING)

    This PR brings the plugin up to date to work with WPGraphQL 1.6.12 and newer.

    • Update Types to be Root Types not directly named after the connection they are affecting (breaking change)
    • Register types using the get_graphql_register_action()

    Instead of Types being named after the connection they're on, they're root type names.

    Ex:

    • RootQueryToPostConnectionWhereArgsTaxQuery is now TaxQuery
    • RootQueryToPostConnectionWhereArgsTaxQueryOperator is now TaxQueryOperator
    • RootQueryToPostConnectionWhereArgsTaxArray is now TaxArray
    • RootQueryToPostConnectionWhereArgsTaxQueryField is now TaxQueryField
    • RootQueryToPostConnectionWhereArgsTaxQueryField is now TaxQueryField

    Before:

    query getPosts(
      $operator: RootQueryToPostConnectionWhereArgsTaxQueryOperator
    ) {
      posts(
        where: {
          taxQuery: {
            taxArray: [
              {
                terms: ["cat1", "cat2"]
                taxonomy: CATEGORY
                operator: $operator
                field: SLUG
              }
            ]
          }
        }
      ) {
        nodes {
          slug
        }
      }
    }
    

    After:

    query getPosts(
      $operator: TaxQueryOperator
    ) {
      posts(
        where: {
          taxQuery: {
            taxArray: [
              {
                terms: ["cat1", "cat2"]
                taxonomy: CATEGORY
                operator: $operator
                field: SLUG
              }
            ]
          }
        }
      ) {
        nodes {
          slug
        }
      }
    }
    
    Breaking Change 
    opened by jasonbahl 5
  • Exclude taxonomy conditionally?

    Exclude taxonomy conditionally?

    Hi,

    does this plugin offer a way to exclude some parameters to a GraphQL request conditionally? I have tried a few default things like directives and interpolation but I can't find a way to make it work...

    My use case is I have a list of posts that users can filter by selecting some options in the frontend; when the filters are applied, the below query fires. What I would like to achieve is that, e.g. if the user does NOT select any genre, I want to NOT define the $genre variable and to NOT include an array for the genre in the taxArray. This is because if $genre is an empty string or even null, Wordpress will still add it to the tax_query and return unintended results.

    As an alternative, so far I modify the server response by filtering in the query args and excluding the genre from the tax_query if the relative parameter is an empty string, but I would prefer to alter the request instead.

    PS. By the way, I use graphql_post_object_connection_query_args to filter the query args, but I'm working with posts of a custom post type opps. Is there a filter to work with a certain custom post type only, something like graphql_opps_object_connection_query_args?

    Thank you for any help and for the whole WPGraphQL project, great work!

    query getOpps( 
      $after: String, 
      $first: Int = 8, 
      $byDeadline: String = "",
      $byStatus: String = "",
      $feeTier: String = "",
      $genre: String = "", 
      $prize: String = ""
    ) {
      opps( 
        after: $after,
        first: $first,
        where: {
          byDeadline: $byDeadline,
          taxQuery: {
            taxArray: [
              {
                terms: [ $byStatus ],
                taxonomy: OPPSCATEGORY,
                operator: IN,
                field: SLUG
              },
              {
                terms: [ $feeTier ],
                taxonomy: OPPSCATEGORY,
                operator: IN,
                field: SLUG
              },
              {
                terms: [ $genre ],
                taxonomy: OPPSCATEGORY,
                operator: IN,
                field: SLUG
              },
              {
                terms: [ $prize ],
                taxonomy: OPPSCATEGORY,
                operator: IN,
                field: SLUG
              }
            ]
          }
        }
      ) {
        pageInfo {
          endCursor
          hasNextPage
        }
        edges {
          node {
            id
            link
            slug
            title
            contentType {
              node {
                name
              }
            }
          }
        }
      }
    }
    
    question 
    opened by grazianodev 5
  • Fix term arrays for ID & TAXONOMY_ID

    Fix term arrays for ID & TAXONOMY_ID

    When querying by field ID or TAXONOMY_ID the results were incorrect because it was only using the last element in the original array

    example: The following will only show posts that are in Category id 30 (it doesn't show those in 10 or 20)

    posts( where: { taxQuery: { relation: AND taxArray: [ { terms: [10, 20, 30], field: ID, taxonomy: CATEGORY, operator: IN } ] } } )

    opened by iamlili 3
  • Not working for pages

    Not working for pages

    I have a custom taxonomy called type. It is used on pages.

    The below taxQuery doesn't work, it returns empty results. There are 11 pages in the type category with slug latest.

    query{
      pages(
        where: {
          taxQuery: {
            taxArray: [
              {
                terms: ["latest"],
                taxonomy: TYPE,
                operator: IN,
                field: SLUG
              }
            ]
          }
      	}
      ){
        edges{
          cursor
          node{
            slug
            title
          }
        }
      }
    }
    

    And the results are:

    {
      "data": {
        "pages": {
          "edges": []
        }
      }
    }
    
    opened by drewbaker 3
  • Fix issue with array term value being overwritten

    Fix issue with array term value being overwritten

    The formatted terms needs to add brackets in order for the int value of the termID to be pushed to a new array item. Currently, the value of the formatted_term is overwritten for each term. This fixes that issue.

    opened by davidjpetersen 2
  • Version 0.1.0 is crashing nuxt

    Version 0.1.0 is crashing nuxt

    Expected Behavior

    Should enable taxQuery on RootQueryToPageConnectionWhereArgs

    Current Behavior

    Crashes nuxt app on install. Receiving error Fatal error: Uncaught ArgumentCountError: Too few arguments to function WPGraphQL\TaxQuery::add_input_fields(), 3 passed in /www/wp-includes/class-wp-hook.php on line 286 and exactly 4 expected in /www/wp-content/plugins/wp-graphql-tax-query-master/wp-graphql-tax-query.php:131 Stack trace: #0 /www/wp-includes/class-wp-hook.php(286): WPGraphQL\TaxQuery->add_input_fields(Array, 'RootQueryToCate...', Array) #1 /www/wp-includes/plugin.php(208): WP_Hook->apply_filters(Array, Array) #2 /www/wp-content/plugins/wp-graphql-develop/src/Type/WPInputObjectType.php(40): apply_filters('graphql_input_f...', Array, 'RootQueryToCate...', Array) #3 /www/wp-content/plugins/wp-graphql-develop/src/Registry/TypeRegistry.php(440): WPGraphQL\Type\WPInputObjectType::prepare_fields(Array, 'RootQueryToCate...') #4 [internal function]: WPGraphQL\Registry\TypeRegistry->WPGraphQL\Registry\{closure}() #5 /www/wp-content/plugins/wp-graphql-develop/vendor/webonyx/graphql-php/src/Type/Definition/InputObjectType.php(50): call_user_func(Object(Closure)) #6 in /www/wp-content/plugins/wp-graphql-tax-query-master/wp-graphql-tax-query.php on line 131 from wordpress-backend.com/graphql

    Steps to Reproduce

    1. Install WP GraphQl Version 0.4.1
    2. Install WPGraphQL Tax Query Version 0.3.1
    opened by dChiamp 2
  • 0.1.0 AND & OR relation do the same thing is using more than 2 taxonomies

    0.1.0 AND & OR relation do the same thing is using more than 2 taxonomies

    this query

    {
      projecten(
        where: {taxQuery: {
          relation: AND, 
          taxArray: [
            {terms: ["workshop"], taxonomy: CATEGORY, operator: IN, field: SLUG}, 
            {terms: ["podcast"], taxonomy: TAG, operator: IN, field: SLUG}, 
            {terms: ["kinderen"], taxonomy: LEEFTIJD, operator: IN, field: SLUG}
          ]
        }
    	}
      ) {
        edges {
          node {
            link
            date
            title
          }
        }
      }
    }
    

    displays the exact same result as this one

    {
      projecten(
        where: {taxQuery: {
          relation: OR, 
          taxArray: [
            {terms: ["workshop"], taxonomy: CATEGORY, operator: IN, field: SLUG}, 
            {terms: ["podcast"], taxonomy: TAG, operator: IN, field: SLUG}, 
            {terms: ["kinderen"], taxonomy: LEEFTIJD, operator: IN, field: SLUG}
          ]
        }
    	}
      ) {
        edges {
          node {
            link
            date
            title
          }
        }
      }
    }
    

    Narmally the second query (with relation: OR) should display much more posts because there are a lot of posts with tag 'podcast'.

    What is going on ?

    opened by koraysels 1
  • Error when trying to filter a CPT by a custom taxonomy via NodeByUri

    Error when trying to filter a CPT by a custom taxonomy via NodeByUri

    This query:

    query PORTFOLIO_LIST($uri: String! $where: HierarchicalContentNodeToContentNodeConnectionWhereArgs) {
      nodeByUri(uri: $uri) {
        id
        ... on NodeWithTitle {
          title
        }
        ... on PrimaryPage {
          id
          children(where: $where) {
            nodes {
              id
              ... on PrimaryPage {
                title
              }
            }
          }
        }
      }
    }
    

    With these var's:

    {
      "uri": "/primary/featured-work/",
      "where": {"taxQuery": {"taxArray": {"terms": "featured", "taxonomy": "FILTER", "field": "SLUG"}}}
    }
    

    Gives this error:

    {
      "errors": [
        {
          "message": "Variable \"$where\" got invalid value {\"taxQuery\":{\"taxArray\":{\"terms\":\"featured\",\"taxonomy\":\"FILTER\",\"field\":\"SLUG\"}}}; Expected type HierarchicalContentNodeToContentNodeConnectionWhereArgsTaxArray to be an object at value.taxQuery.taxArray.terms.",
          "extensions": {
            "category": "graphql"
          },
          "locations": [
            {
              "line": 1,
              "column": 36
            }
          ]
        },
        {
          "message": "Variable \"$where\" got invalid value {\"taxQuery\":{\"taxArray\":{\"terms\":\"featured\",\"taxonomy\":\"FILTER\",\"field\":\"SLUG\"}}}; Expected type HierarchicalContentNodeToContentNodeConnectionWhereArgsTaxArray to be an object at value.taxQuery.taxArray.taxonomy.",
          "extensions": {
            "category": "graphql"
          },
          "locations": [
            {
              "line": 1,
              "column": 36
            }
          ]
        },
        {
          "message": "Variable \"$where\" got invalid value {\"taxQuery\":{\"taxArray\":{\"terms\":\"featured\",\"taxonomy\":\"FILTER\",\"field\":\"SLUG\"}}}; Expected type HierarchicalContentNodeToContentNodeConnectionWhereArgsTaxArray to be an object at value.taxQuery.taxArray.field.",
          "extensions": {
            "category": "graphql"
          },
          "locations": [
            {
              "line": 1,
              "column": 36
            }
          ]
        }
      ]
    }
    

    Not it works if I don't pass in the where arg as a var and just hardcode it into the query. What am I doing wrong?

    opened by drewbaker 1
  • Compatibility with core plugin

    Compatibility with core plugin

    Could you clarify the compatibility between the version of this addon and the wp-graphql core plugin? I was trying to make this work with 0.0.2 and 0.1.0 of the extension and version 0.3.4, 0.3.5, 0.3.8 and 0.4.0 of the core plugin but had no luck. The taxQuery field is not showing up under posts > where :-(

    opened by hatsumatsu 1
  • Make a search in ACF custom field value

    Make a search in ACF custom field value

    I want to perform a search query for a custom post type (poems, similar to posts), and search in the value of the field "text_to_index".

    For example, a poem (post) could have "text_to_index" custom field, with this value: "Please feed the cats"

    I want to be able to search "cats" and retrieve the relevant poem node.

    {
      poems(where: {search: "cats"}) {
        nodes {
          id
          title
          content
        }
      }
    }
    

    Currently, the above query only searches in "title" and "content". I need it to search in the value of ACF custom field.

    How do I do that?

    opened by elron 0
  • Error when using RootQueryToShopItemConnectionWhereArgsTaxArray as a variable

    Error when using RootQueryToShopItemConnectionWhereArgsTaxArray as a variable

    I'm receiving the following error while running the query with variables

    "Type loader is expected to return a callable or valid type "RootQueryToShopItemConnectionWhereArgsTaxArray", but it returned null"

    the query to reproduce the issue:

    query GET_SHOP_ITEMS_BY_CATS_TAGS($taxArray: [RootQueryToShopItemConnectionWhereArgsTaxArray]) { shop( where: {status: PUBLISH, taxQuery: {relation: AND, taxArray: $taxArray}, } ) { nodes { title databaseId uri } } }

    query variables: { "taxArray": [{ "operator": "IN", "taxonomy": "SHOPCATEGORY", "terms": "grafika", "field": "SLUG"}] }

    opened by vstrelianyi 0
  • terms array is not working as it should

    terms array is not working as it should

    when using the following query:

    {operator: IN, taxonomy: CATEGORY, terms: ["91","80"], field: ID},

    only posts with last ID in array ( 80 ) are returned


    NOTE: when I use SLUG as field like here:

    {operator: IN, taxonomy: CATEGORY, terms: ["slug1","slug2"], field: SLUG},

    the query returns the correct data

    opened by vstrelianyi 1
  • Error when using `RootQueryToPageConnectionWhereArgsTaxQueryOperator` enum as a variable

    Error when using `RootQueryToPageConnectionWhereArgsTaxQueryOperator` enum as a variable

    Hi guys,

    I found an issue when passing the RootQueryToPageConnectionWhereArgsTaxQueryOperator enum as a variable, it throws the following error:

    {
      "errors": [
        {
          "debugMessage": "Type loader is expected to return a callable or valid type \"RootQueryToPageConnectionWhereArgsTaxQueryOperator\", but it returned null",
          "message": "Internal server error",
          "extensions": {
            "category": "internal"
          }
        }
      ]
    }
    

    This is the stack trace when running the query below on WP-GraphQL 1.6.12: https://gist.github.com/ltroya-as/8b0bf88d8bdbee5bd8789121633c5434

    And the query to reproduce the issue:

    query getArticlesByCategories(
      $operator: RootQueryToPageConnectionWhereArgsTaxQueryOperator = IN
    ) {
      pages(
        where: {
          taxQuery: {
            taxArray: [
              {
                terms: ["cat1", "cat2"]
                taxonomy: CATEGORY
                operator: $operator
                field: SLUG
              }
            ]
          }
        }
      ) {
        nodes {
          slug
        }
      }
    }
    

    That error happens on the following versions: 1.6.12, 1.8.2, and 1.8.6.

    However, it works on 1.5.8

    Thread on WP-GraphQL Slack: https://wp-graphql.slack.com/archives/C3NM1M291/p1657813663734659

    opened by ltroya-as 0
  • Compatability issue with WPGraphql 1.6+

    Compatability issue with WPGraphql 1.6+

    The plugin causes an error when attempting to run a taxQuery on a contentNode when using wpGraphQL 1.6.4.

    Steps to reproroduce:

    This query:

    query MyQuery { contentNodes(where: {taxQuery: {relation: AND, taxArray: {field: SLUG, operator: AND, taxonomy: CATEGORY, terms: "watches"}}}) { nodes { ... on NodeWithTitle { title } } } }

    Succeeds when using WPGraphql 1.5.9 but fails on 1.6.4 with the message:

    Type loader is expected to return a callable or valid type "RootQueryToContentNodeConnectionWhereArgsTaxArray", but it returned null"

    opened by tomgreeEn 8
Releases(v0.2.0)
  • v0.2.0(Nov 8, 2022)

    What's Changed

    • Unset relation field when count is less than 2 by @daltonrooney in https://github.com/wp-graphql/wp-graphql-tax-query/pull/19
    • Update to work with WPGraphQL v1.6.12+ (BREAKING) by @jasonbahl in https://github.com/wp-graphql/wp-graphql-tax-query/pull/32
    • Fix term arrays for ID & TAXONOMY_ID by @iamlili in https://github.com/wp-graphql/wp-graphql-tax-query/pull/23
    • Using a taxonomy query doesn't set the request type properly in WP_Query by @mwidmann in https://github.com/wp-graphql/wp-graphql-tax-query/pull/12
    • release: v0.2.0 by @jasonbahl in https://github.com/wp-graphql/wp-graphql-tax-query/pull/36

    New Contributors

    • @daltonrooney made their first contribution in https://github.com/wp-graphql/wp-graphql-tax-query/pull/19
    • @iamlili made their first contribution in https://github.com/wp-graphql/wp-graphql-tax-query/pull/23
    • @mwidmann made their first contribution in https://github.com/wp-graphql/wp-graphql-tax-query/pull/12

    Full Changelog: https://github.com/wp-graphql/wp-graphql-tax-query/compare/v0.1.0...v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Oct 28, 2019)

  • v0.0.2(Aug 3, 2017)

Owner
WPGraphQL
An Open Source WordPress plugin that enables a GraphQL API for WordPress sites
WPGraphQL
Enable query locking for WPGraphQL by implementing persisted GraphQL queries.

?? WP GraphQL Lock This plugin enables query locking for WPGraphQL by implementing persisted GraphQL queries. Persisted GraphQL queries allow a GraphQ

Valu Digital 21 Oct 9, 2022
[ALPHA] Implementation of persisted queries for WPGraphQL

WPGraphQL Persisted Queries Persisted GraphQL queries allow a GraphQL client to optimistically send a hash of the query instead of the full query; if

Quartz 18 Jun 20, 2022
Wordpress wrapper to expose Carbon Fields to WpGraphQL queries.

WpGraphQLCrb A Wordpress wrapper to expose Carbon Fields to WpGraphQL queries. Important This is just the first version. There is a lot of work to be

Matheus Paiva 16 Aug 19, 2022
Querycase provides a convenient, fluent interface for creating and running database queries in WordPress.

Querycase database for WordPress Dependency-free library to create SQL Queries in WordPress. Explore the documentation → ℹ️ About Querycase Querycase

Alessandro Tesoro 7 Oct 17, 2021
Adds meta data registered via register_meta() to the GraphQL output.

WP GraphQL Meta This plugin is an add-on for the awesome WP GraphQL It builds on top of both WP GraphQL and the REST API. Any meta data you register u

Robert O'Rourke 18 Aug 4, 2021
An WPGraphQL extension that adds SearchWP's query functionality to the GraphQL server

QL Search What is QL Search? An extension that integrates SearchWP into WPGraphQL. Quick Install Install & activate SearchWP v3.1.9+ Install & activat

Funkhaus 11 May 5, 2022
Adds Settings to the Custom Post Type UI plugin to show Post Types in WPGraphQL

DEPRECATION NOTICE ?? Custom Post Type UI v1.9.0 introduced formal support for WPGraphQL!!! ?? With that, this plugin is being deprecated and will no

WPGraphQL 77 Aug 3, 2022
Laravel Blog Package. Easiest way to add a blog to your Laravel website. A package which adds wordpress functionality to your website and is compatible with laravel 8.

Laravel Blog Have you worked with Wordpress? Developers call this package wordpress-like laravel blog. Contact us for any customization: contact@binsh

Binshops 279 Dec 28, 2022
Simple Wordpress plugin that adds social share buttons

Super Fast Social Share Simple Wordpress plugin that adds social share buttons to Wordpress posts. ?? Screenshots You can either load the default css

Matthew Kiggen 2 Nov 8, 2021
Adds a beautiful WhatsApp Sticky Button on the WordPress frontend

Adds a beautiful WhatsApp Sticky Button on the WordPress frontend

Rasoul Mousavian 8 Dec 22, 2022
Adds a dashboard widget that allows admins to quickly open the edit screen for any WordPress post type- including orders, products, and subscriptions.

Quick Open Dashboard Widget Requires PHP: 7.0 WP requires at least: 5.7 WP tested up to: 5.7 WC requires at least: 5.6.0 WC tested up to: 5.8.0 Stable

Universal Yums 4 Nov 11, 2021
Adds WordPress toolbar menu that allows users to switch theme for themselves.

Toolbar Theme Switcher — for WordPress Plugin provides toolbar (admin bar) menu to quickly switch between available themes. Theme choice is individual

Andrey Savchenko 20 Jul 23, 2021
Add WooCommerce support and functionality to your WPGraphQL server

WPGraphQL WooCommerce (WooGraphQL) Docs • AxisTaylor • Join Slack Quick Install Install & activate WooCommerce Install & activate WPGraphQL Download t

WPGraphQL 546 Jan 2, 2023
Add theming support to your Laravel 5.* projects

Laravel Theme Add theming support to your Laravel 5.* projects. Features Custom theme locations Support for theme inheritence with theme fallback Them

Karlo Mikus 70 Feb 5, 2022
Google Analytics 4 (GA4) AMP support WordPress plugin

Google Analytics 4 (GA4) AMP support WordPress plugin. Download from WordPress About Google Analytics 4 (GA4) AMP support WordPress plugin. Contributi

Roland Farkas 2 Jun 29, 2022
🚀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 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
Authentication for WPGraphQL using JWT (JSON Web Tokens)

WPGraphQL JWT Authentication This plugin extends the WPGraphQL plugin to provide authentication using JWT (JSON Web Tokens) JSON Web Tokens are an ope

WPGraphQL 268 Dec 31, 2022
Send emails via mutation using WpGraphQl

WPGraphQL Send Email Plugin One of the simple things about a traditional WordPress sites is sending emails, this plugin makes it easy to do this via a

Ashley Hitchcock 18 Aug 21, 2022