Categories
How To

It’s Just Math: WP-CLI Edition

A quick WP-CLI example of running calculations.

Table of Contents

Remember how I talked about doing math on a post when it was saved?

Well what if I wanted to run that at another time? Like what if I knew I needed to update one show and I didn’t want to go in and save the post?

I can to this with WP-CLI:

WP CLI Magic WP CLI Magic

class WP_CLI_MySite_Commands extends WP_CLI_Command {
	/**
	 * Re-run calculations for specific post content.
	 * 
	 * ## EXAMPLES
	 * 
	 *		wp mysite calc actor ID
	 *		wp mysite calc show ID
	 *
	*/
	
	function calc( $args , $assoc_args ) {

		// Valid things to calculate:
		$valid_calcs = array( 'actor', 'show' );
		
		// Defaults
		$format = ( isset( $assoc_args['format'] ) )? $assoc_args['format'] : 'table';

		// Check for valid arguments and post types
		if ( empty( $args ) || !in_array( $args[0], $valid_calcs ) ) {
			WP_CLI::error( 'You must provide a valid type of calculation to run: ' . implode( ', ', $valid_calcs ) );
		}

		// Check for valid IDs
		if( empty( $args[1] ) || !is_numeric( $args[1] ) ) {
			WP_CLI::error( 'You must provide a valid post ID to calculate.' );
		}

		// Set the post IDs:
		$post_calc = sanitize_text_field( $args[0] );
		$post_id   = (int)$args[1];

		// Last sanitity check: Is the post ID a member of THIS post type...
		if ( get_post_type( $post_id ) !== 'post_type_' . $post_calc . 's' ) {
			WP_CLI::error( 'You can only calculate ' . $post_type . 's on ' . $post_type . ' pages.' );
		}

		// Do the thing!
		// i.e. run the calculations
		switch( $post_calc ) {
			case 'show':
				// Rerun show calculations
				MySite_Show_Calculate::do_the_math( $post_id );
				$score = 'Score: ' . get_post_meta( $post_id, 'shows_the_score', true );
				break;
			case 'actor':
				// Recount characters and flag queerness
				MySite_Actor_Calculate::do_the_math( $post_id );
				$queer = ( get_post_meta( $post_id, 'actors_queer', true ) )? 'Yes' : 'No';
				$chars = get_post_meta( $post_id, 'actors_char_count', true );
				$deads = get_post_meta( $post_id, 'actors_dead_count', true );
				$score = ': Is Queer (' . $queer . ') Chars (' . $chars . ') Dead (' . $deads . ')';
				break;
		}

		WP_CLI::success( 'Calculations run for ' . get_the_title( $post_id ) . $score );
	}
}

Top ↑

What the What? What the What?

The one for shows is a lot simpler. I literally call that do_the_math() function with the post ID and I get back a number. Then I output the number and I’m done. If I wanted it to run for all shows, I could use WP-CLI to spit out a list of all the IDs and then pass them to the command one at a time. Or I could write one that does ‘all’ posts. Which I may

But the point is that I now can type wp mysite calc show 1234 and if post ID 1234 is a show, it’ll run.