/quick-query

Quick Query is a Wordpress plugin that helps you get the posts and data you need, quickly

Primary LanguagePHPMIT LicenseMIT

Quick Query (alpha)

Build Status

Quick Query is an interface for fetching data from WordPress that's intuitive and pleasant to use. It uses a jQuery-like syntax to chain together simple pieces of information and get you the right information in return.

Project Update 8-15-2014

Here are a few nuggets:

  • As it happens, keeping the SVN version of this up to date on wordpress.org is a PITA, so until this gets to a real alpha, I'm not going to waste my energy there
  • when that does happen, I'll make sure composer + wp.org both have access to QQ
  • all posts are retrieved by default. I think Wordpress's not-so-smart defaults are something developers should be explicit about, so warm up your ppp()
  • Tests are going very well, though I had a hell of a time with Wordpress + PHPUnit and that incomplete/horribly-documented factory class. I ended up creating objects for unit tests with a combination of factory stuff, built-in wordpress functions, and a smattering of wizardry
  • Tags, taxonomy, and the like are easily the most complicated part of this. I'm nearly done with a draft that accommodates most all kinds of tax_queries, but I need to test it in combination with other WP_Query params and work on the tax() chaining interface
  • The authors, parents & children code should come very quickly after that

How it works & Background

Quick Query began as a scrap of syntactic sugar for dealing with WP_Query. Over the course of a few projects, this sugary treat grew into necessity that simplified 80% of the time-consuming query code into a few pleasant lines.

Here's an comparison in a demanding scenario:

// The WP_Query way
$args = array(
	'post_type' => 'post',
	'tax_query' => array(
		'relation' => 'AND',
		array(
			'taxonomy' => 'movie_genre',
			'field' => 'slug',
			'terms' => array( 'action', 'comedy' )
		),
		array(
			'taxonomy' => 'actor',
			'field' => 'id',
			'terms' => array( 103, 115, 206 ),
			'operator' => 'NOT IN'
		)
	)
);
$query = new WP_Query( $args );

// The Quick Query way
$posts = $q->type('post')->tags( ['movie_genre' => ['action','comedy'], 'actor' => [103, 115, 206]], 'AND' );

The plan

I'm working on creating an honest-to-goodness open source version of it from the ground up. At the time of this writing, Quick Query is just a class wrapper with all of our code commented out.

I'll be working on this (along with anyone who enjoys the idea of mitigating the emotional damage WP_Query causes) to incrementally re-add the functionality of QQuery along with tests and docs as we go.

TODO

  • Post Type
  • $qq->type('some-type')
  • Fetch Post by ID
  • $qq->get(42)
  • ACF sensory
  • Fetch Post in set of IDs
  • $qq->in([2, 5, 42])
  • Sort order
  • $qq->sort('date', 'DESC')
  • Exclude ID(s)
  • Return all posts
  • $qq->all()
  • Set posts per page
  • $qq->ppp(20)
  • Meta Fields options
  • $qq->meta('author')
  • Pagination & Offset
  • $qq->ppp(3)->page(2)
  • Filter by post status
  • $qq->status('published')
  • $qq->status(['published','draft'])
  • Terms, Taxonomies & Categories
  • $qq->term('cats')
  • $qq->tax('animals')
  • $qq->tax(['animals'=>['cats', 'dogs'], ['pizza'=>['deep', 'NYC']], 'OR')
  • $qq->category('fish')
  • Authors
  • $qq->author(1)
  • $qq->author('Pete Karl II')
  • Parents & Children
  • $qq->parent(22)
  • $qq->parent('some-slug')
  • $qq->children('some_post_type')

Needs Tests

  • ACF, see tests/test_qq_acf.php

Needs docs

(everything)

Running Tests

I recommend using 10up's VVV to set up a wordpress environment.

From there, what I've done is cloned this repo, added it as a sync'd folder in VVV's Vagrant file, and then symlinked it to my wordpress repos.

To sync any additional folder, add config.vm.synced_folder "/path/to/your/folder/", "/srv/vagrant/mirror/" to your Vagrantfile so you can edit code in your OS and run tests VM effortlessly

To run the tests, I vagrant ssh into the vbox, navigate to the plugin directory, and run phpunit (or, more frequently, phpunit --debug)