wp-cli-bbpress/components/forum.php
2018-05-27 16:39:56 -03:00

501 lines
11 KiB
PHP

<?php
namespace bbPress\CLI\Command;
use WP_CLI;
/**
* Manage bbPress Forums.
*
* @since 1.0.0
*/
class Forum extends bbPressCommand {
/**
* Object fields.
*
* @var array
*/
protected $obj_fields = array(
'ID',
'post_title',
'post_name',
'post_date',
'post_status',
);
/**
* Create a forum.
*
* ## OPTIONS
*
* [--title=<title>]
* : Forum title.
*
* [--content=<content>]
* : Forum content.
* ---
* default: 'Content for forum "[title]"'
* ---
*
* [--user-id=<user>]
* : Identifier for the user. Accepts either a user_login or a numeric ID.
* ---
* default: 1
* ---
*
* [--forum-id=<forum-id>]
* : Identifier of the forum.
* ---
* default: 0
* ---
*
* [--forum-status=<forum-status>]
* : Forum status (publish, pending, spam, trash).
* ---
* default: publish
* ---
*
* [--status=<status>]
* : Forum status (open, close).
* ---
* default: open
* ---
*
* [--silent]
* : Whether to silent the forum creation.
*
* [--porcelain]
* : Output only the new forum id.
*
* ## EXAMPLES
*
* $ wp bbp forum create --title="Forum Test 01" --content="Content for forum" --user-id=39
* $ wp bbp forum create --title="Forum 02" --content="Another content for forum" --user-id=45 --status=closed
*
* @alias add
*/
public function create( $args, $assoc_args ) {
$r = wp_parse_args( $assoc_args, array(
'title' => '',
'content' => '',
'user-id' => 1,
'forum-id' => 0,
'forum-status' => 'publish',
'status' => 'open',
) );
if ( empty( $r['content'] ) ) {
$r['content'] = sprintf( 'Content for the forum "%s"', $r['title'] );
}
// Fallback for forum status.
if ( ! in_array( $r['forum-status'], $this->forum_status(), true ) ) {
$r['forum-status'] = 'publish';
}
$user = $this->get_user_id_from_identifier( $r['user-id'] );
$forum_data = array(
'post_parent' => $r['forum-id'],
'post_title' => $r['title'],
'post_content' => $r['content'],
'post_status' => $r['forum-status'],
'post_author' => $user->ID,
);
$forum_meta = array(
'status' => $r['status'],
);
$id = bbp_insert_forum( $forum_data, $forum_meta );
// Silent it before it errors.
if ( \WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
return;
}
if ( ! is_numeric( $id ) ) {
\WP_CLI::error( 'Could not create forum.' );
}
if ( \WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
\WP_CLI::line( $id );
} else {
\WP_CLI::success( sprintf( 'Forum %d created: %s', $id, bbp_get_forum_permalink( $id ) ) );
}
}
/**
* Get a forum.
*
* ## OPTIONS
*
* <forum-id>
* : Identifier for the forum.
*
* [--fields=<fields>]
* : Limit the output to specific fields. Defaults to all fields.
*
* [--format=<format>]
* : Render output in a particular format.
* ---
* default: table
* options:
* - table
* - json
* - csv
* - yaml
* ---
*
* ## EXAMPLES
*
* $ wp bbp forum get 6654
* $ wp bbp forum see 53564
*
* @alias see
*/
public function get( $args, $assoc_args ) {
$forum_id = $args[0];
// Check if forum exists.
if ( ! bbp_is_forum( $forum_id ) ) {
\WP_CLI::error( 'No forum found by that ID.' );
}
$forum = bbp_get_forum( $forum_id, ARRAY_A );
$forum['url'] = bbp_get_forum_permalink( $forum_id );
if ( empty( $assoc_args['fields'] ) ) {
$assoc_args['fields'] = array_keys( $forum );
}
$formatter = $this->get_formatter( $assoc_args );
$formatter->display_item( $forum );
}
/**
* Delete a forum (its topics and replies).
*
* ## OPTIONS
*
* <forum-id>...
* : One or more IDs of forums to delete.
*
* [--yes]
* : Answer yes to the confirmation message.
*
* ## EXAMPLE
*
* $ wp bbp forum delete 486
* Success: Forum 486 and its topics and replies deleted.
*/
public function delete( $args, $assoc_args ) {
$forum_id = $args[0];
\WP_CLI::confirm( 'Are you sure you want to delete this forum and its topics/replies?', $assoc_args );
parent::_delete( array( $forum_id ), $assoc_args, function ( $forum_id ) {
// Check if forum exists.
if ( ! bbp_is_forum( $forum_id ) ) {
\WP_CLI::error( 'No forum found by that ID.' );
}
bbp_delete_forum_topics( $forum_id );
wp_delete_post( $forum_id, true );
if ( ! bbp_deleted_forum( $forum_id ) ) {
return array( 'success', sprintf( 'Forum %d and its topics and replies deleted.', $forum_id ) );
} else {
return array( 'error', sprintf( 'Could not delete forum %d and its topics and replies.', $forum_id ) );
}
} );
}
/**
* Get a list of forums.
*
* ## OPTIONS
*
* [--fields=<fields>]
* : Limit the output to specific object fields.
*
* [--format=<format>]
* : Render output in a particular format.
* ---
* default: table
* options:
* - table
* - ids
* - count
* - json
* - csv
* - yaml
* ---
*
* ## EXAMPLES
*
* # List ids of all forums
* $ wp bbp forum list --format=ids
* 15 25 34 37 198
*
* # List total count of forums
* $ wp bbp forum list --format=count
* 451
*
* @subcommand list
*/
public function _list( $_, $assoc_args ) {
$formatter = $this->get_formatter( $assoc_args );
$forum_post_type = bbp_get_forum_post_type();
$query_args = wp_parse_args( $assoc_args, array(
'post_type' => $forum_post_type,
) );
$query_args = self::process_csv_arguments_to_arrays( $query_args );
if ( isset( $query_args['post_type'] ) && $forum_post_type !== $query_args['post_type'] ) {
$query_args['post_type'] = $forum_post_type;
}
if ( 'ids' === $formatter->format ) {
$query_args['fields'] = 'ids';
$query = new \WP_Query( $query_args );
echo implode( ' ', $query->posts ); // WPCS: XSS ok.
} elseif ( 'count' === $formatter->format ) {
$query_args['fields'] = 'ids';
$query = new \WP_Query( $query_args );
$formatter->display_items( $query->posts );
} else {
$query = new \WP_Query( $query_args );
$forums = array_map( function( $post ) {
$post->url = get_permalink( $post->ID );
return $post;
}, $query->posts );
$formatter->display_items( $forums );
}
}
/**
* Trash a forum.
*
* ## OPTIONS
*
* <forum-id>
* : Indentifier of the forum to trash.
*
* ## EXAMPLE
*
* $ wp bbp forum trash 789
* Success: Forum 789 and its topics trashed.
*/
public function trash( $args, $assoc_args ) {
$forum_id = $args[0];
// Check if forum exists.
if ( ! bbp_is_forum( $forum_id ) ) {
\WP_CLI::error( 'No forum found by that ID.' );
}
bbp_trash_forum_topics( $forum_id );
wp_trash_post( $forum_id );
if ( ! bbp_trashed_forum( $forum_id ) ) {
\WP_CLI::success( sprintf( 'Forum %d and its topics trashed.', $forum_id ) );
} else {
\WP_CLI::error( sprintf( 'Could not trash forum %d and its topics.', $forum_id ) );
}
}
/**
* Untrash a forum.
*
* ## OPTIONS
*
* <forum-id>
* : Indentifier of the forum to untrash.
*
* ## EXAMPLE
*
* $ wp bbp forum untrash 3938
* Success: Forum 3938 and its topics untrashed.
*/
public function untrash( $args, $assoc_args ) {
$forum_id = $args[0];
// Check if forum exists.
if ( ! bbp_is_forum( $forum_id ) ) {
\WP_CLI::error( 'No forum found by that ID.' );
}
wp_untrash_post( $forum_id );
bbp_untrash_forum_topics( $forum_id );
if ( ! bbp_untrashed_forum( $forum_id ) ) {
\WP_CLI::success( sprintf( 'Forum %d and its topics untrashed.', $forum_id ) );
} else {
\WP_CLI::error( sprintf( 'Could not untrash forum %d and its topics.', $forum_id ) );
}
}
/**
* Generate random forums (forums only).
*
* ## OPTIONS
*
* [--count=<number>]
* : How many forums to generate.
* ---
* default: 100
* ---
*
* [--forum-status=<forum-status>]
* : Forum status (publish, pending, spam, trash or mixed).
* ---
* default: publish
* ---
*
* [--status=<status>]
* : Status (open, close or mixed).
* ---
* default: open
* ---
*
* ## EXAMPLES
*
* $ wp bbp forum generate --count=50
* $ wp bbp forum generate --count=20 --status=closed
* $ wp bbp forum generate --count=15 --status=mixed
*/
public function generate( $args, $assoc_args ) {
$notify = \WP_CLI\Utils\make_progress_bar( 'Generating forums', $assoc_args['count'] );
for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
$this->create( array(), array(
'title' => sprintf( 'Test Forum - #%d', $i ),
'content' => sprintf( 'Content for the forum - #%d', $i ),
'forum-status' => $this->random_forum_status( $assoc_args['forum-status'] ),
'status' => $this->random_status( $assoc_args['status'] ),
'silent',
) );
$notify->tick();
}
$notify->finish();
}
/**
* Open a forum.
*
* ## OPTIONS
*
* <forum-id>
* : Indentifier of the forum to open.
*
* ## EXAMPLE
*
* $ wp bbp forum open 456
* Success: Forum 456 successfully opened.
*/
public function open( $args, $assoc_args ) {
$forum_id = $args[0];
// Check if forum exists.
if ( ! bbp_is_forum( $forum_id ) ) {
\WP_CLI::error( 'No forum found by that ID.' );
}
if ( bbp_is_forum_open( $forum_id ) ) {
\WP_CLI::error( 'Forum is already opened.' );
}
if ( is_numeric( bbp_open_forum( $forum_id ) ) ) {
\WP_CLI::success( sprintf( 'Forum %d successfully opened.', $forum_id ) );
} else {
\WP_CLI::error( sprintf( 'Could not open forum %d.', $forum_id ) );
}
}
/**
* Close a forum.
*
* ## OPTIONS
*
* <forum-id>
* : Indentifier of the forum to close.
*
* ## EXAMPLE
*
* $ wp bbp forum close 847
* Success: Forum 847 successfully closed.
*/
public function close( $args, $assoc_args ) {
$forum_id = $args[0];
// Check if forum exists.
if ( ! bbp_is_forum( $forum_id ) ) {
\WP_CLI::error( 'No forum found by that ID.' );
}
if ( bbp_is_forum_closed( $forum_id ) ) {
\WP_CLI::error( 'Forum is already closed.' );
}
if ( is_numeric( bbp_close_forum( $forum_id ) ) ) {
\WP_CLI::success( sprintf( 'Forum %d successfully closed.', $forum_id ) );
} else {
\WP_CLI::error( sprintf( 'Could not close the forum %d.', $forum_id ) );
}
}
/**
* List of forum statuses.
*
* @since 1.0.0
*
* @return array An array of default forum status.
*/
protected function forum_status() {
return array( 'publish', 'pending', 'spam', 'trash' );
}
/**
* Get a random forum statuses.
*
* @since 1.0.0
*
* @param string $status Forum status.
* @return string Random Forum Status.
*/
protected function random_forum_status( $status ) {
$forum_status = $this->forum_status();
$status = ( 'mixed' === $status )
? $forum_status[ array_rand( $forum_status ) ]
: $status;
return $status;
}
/**
* Get a random status.
*
* @since 1.0.0
*
* @param string $status forum status.
* @return string Random forum Status.
*/
protected function random_status( $status ) {
$forum_status = array( 'open', 'close' );
$status = ( 'mixed' === $status )
? $forum_status[ array_rand( $forum_status ) ]
: $status;
return $status;
}
}