Making WordPress.org

Changeset 5406


Ignore:
Timestamp:
04/21/2017 12:53:45 PM (8 years ago)
Author:
danielbachhuber
Message:

make/cli: Register cron event for importing handbook manifest

The manifest includes a registry of all documents in the handbook.

Location:
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-cli
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-cli/inc/class-markdown-import.php

    r4786 r5406  
    88class Markdown_Import {
    99
     10    private static $handbook_manifest = 'https://raw.githubusercontent.com/wp-cli/handbook/master/handbook-manifest.json';
    1011    private static $input_name = 'wporg-cli-markdown-source';
    1112    private static $meta_key = 'wporg_cli_markdown_source';
     
    1314    private static $submit_name = 'wporg-cli-markdown-import';
    1415    private static $supported_post_types = array( 'handbook' );
     16    private static $posts_per_page = 100;
    1517
    1618    /**
     
    1820     */
    1921    public static function action_init() {
     22        if ( ! wp_next_scheduled( 'wporg_cli_manifest_import' ) ) {
     23            wp_schedule_event( time(), '15_minutes', 'wporg_cli_manifest_import' );
     24        }
    2025        if ( ! wp_next_scheduled( 'wporg_cli_markdown_import' ) ) {
    2126            wp_schedule_event( time(), '15_minutes', 'wporg_cli_markdown_import' );
    2227        }
     28    }
     29
     30    public static function action_wporg_cli_manifest_import() {
     31        $response = wp_remote_get( self::$handbook_manifest );
     32        if ( is_wp_error( $response ) ) {
     33            return $response;
     34        } elseif ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
     35            return new WP_Error( 'invalid-http-code', 'Markdown source returned non-200 http code.' );
     36        }
     37        $manifest = json_decode( wp_remote_retrieve_body( $response ), true );
     38        if ( ! $manifest ) {
     39            return new WP_Error( 'invalid-manifest', 'Manifest did not unfurl properly.' );;
     40        }
     41        // Fetch all handbook posts for comparison
     42        $q = new WP_Query( array(
     43            'post_type'      => 'handbook',
     44            'post_status'    => 'publish',
     45            'posts_per_page' => self::$posts_per_page,
     46        ) );
     47        $existing = $q->posts;
     48        $created = 0;
     49        foreach( $manifest as $doc ) {
     50            // Already exists
     51            if ( wp_filter_object_list( $existing, array( 'post_name' => $doc['slug'] ) ) ) {
     52                continue;
     53            }
     54            $post_parent = null;
     55            if ( ! empty( $doc['parent'] ) ) {
     56                // Find the parent in the existing set
     57                $parents = wp_filter_object_list( $existing, array( 'post_name' => $doc['parent'] ) );
     58                if ( ! empty( $parents ) ) {
     59                    $parent = array_shift( $parents );
     60                } else {
     61                    // Create the parent and add it to the stack
     62                    if ( isset( $manifest[ $doc['parent'] ] ) ) {
     63                        $parent_doc = $manifest[ $doc['parent'] ];
     64                        $parent = self::create_post_from_manifest_doc( $parent_doc );
     65                        if ( $parent ) {
     66                            $created++;
     67                            $existing[] = $parent;
     68                        } else {
     69                            continue;
     70                        }
     71                    } else {
     72                        continue;
     73                    }
     74                }
     75                $post_parent = $parent->ID;
     76            }
     77            $post = self::create_post_from_manifest_doc( $doc, $post_parent );
     78            if ( $post ) {
     79                $created++;
     80                $existing[] = $post;
     81            }
     82        }
     83        if ( class_exists( 'WP_CLI' ) ) {
     84            \WP_CLI::success( "Successfully created {$created} handbook pages." );
     85        }
     86    }
     87
     88    /**
     89     * Create a new handbook page from the manifest document
     90     */
     91    private static function create_post_from_manifest_doc( $doc, $post_parent = null ) {
     92        $post_data = array(
     93            'post_type'   => 'handbook',
     94            'post_status' => 'publish',
     95            'post_parent' => $post_parent,
     96            'post_title'  => $doc['title'], // Can contain slashes
     97            'post_name'   => sanitize_title_with_dashes( $doc['slug'] ),
     98        );
     99        $post_data = wp_slash( $post_data );
     100        $post_id = wp_insert_post( $post_data );
     101        if ( ! $post_id ) {
     102            return false;
     103        }
     104        if ( class_exists( 'WP_CLI' ) ) {
     105            \WP_CLI::log( "Created post {$post_id} for {$doc['title']}." );
     106        }
     107        update_post_meta( $post_id, self::$meta_key, esc_url_raw( $doc['markdown_source'] ) );
     108        return get_post( $post_id );
    23109    }
    24110
     
    28114            'post_status'    => 'publish',
    29115            'fields'         => 'ids',
    30             'posts_per_page' => 100,
     116            'posts_per_page' => self::$posts_per_page,
    31117        ) );
    32118        $ids = $q->posts;
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-cli/wporg-cli.php

    r5150 r5406  
    1616 */
    1717add_action( 'init', array( 'WPOrg_Cli\Markdown_Import', 'action_init' ) );
     18add_action( 'wporg_cli_manifest_import', array( 'WPOrg_Cli\Markdown_Import', 'action_wporg_cli_manifest_import' ) );
    1819add_action( 'wporg_cli_markdown_import', array( 'WPOrg_Cli\Markdown_Import', 'action_wporg_cli_markdown_import' ) );
    1920add_action( 'load-post.php', array( 'WPOrg_Cli\Markdown_Import', 'action_load_post_php' ) );
Note: See TracChangeset for help on using the changeset viewer.