Запустите WP-CLI, используя PHP без shell_exec - PullRequest
0 голосов
/ 13 января 2020

Я написал собственный плагин WordPress, который использует команды WP-CLI для импорта RSS-каналов на веб-сайт клиента, однако из-за ограничений на их хостинговой платформе (WPEngine) я не могу использовать crontab, чтобы запланировать запуск команды импорта только как WPEngine. поддерживает использование WP-Cron.

Моей следующей идеей было создание настраиваемого события / расписания WP-Cron для запуска команды через shell_exec(), однако эта команда (и такие, как proc_open()) отключена на уровне сервера и не может быть включен на этой платформе.

Чтобы обойти это, я пытаюсь понять, как запускать мои команды напрямую, получая доступ к моему классу, который расширяет класс WP CLI, но я просто не могу заставить его работать в рамках события WP-Cron приведен пример моего кода:

Мой класс, расширяющий WP-CLI:

// Check if this is being run through the CLI or through a WP-Cron event
if ( ( defined( 'WP_CLI' ) && WP_CLI ) || defined( 'DOING_CRON' ) ) {

    class rss_import extends WP_CLI_Command {

        /* Command to fix early renewals that have the wrong date
         *
         * wp rss_import sync <optional: feedid>
         *
         */
        function sync( $args = '' ) {

            // Set query arguments
            $query_args = array(
                'post_type' => 'example_rss_feed',
                'p' => $args[0],
            );

            // Create query to get the feeds
            $rss_feeds = new WP_Query( $query_args );

            // Check there are feeds
            if ( $rss_feeds->have_posts() ) {

                // Set the feed count
                $rss_feed_count = 1;

                // Loop through each of the feeds
                while ( $rss_feeds->have_posts() ) {

                    // Set the post object
                    $rss_feeds->the_post();

                    // Set variables for feed details
                    $feed_title = get_the_title();
                    $feed_url = get_post_meta( $rss_feeds->post->ID, 'example_rss_feed_url', true );
                    $feed_post_type = get_post_meta( $rss_feeds->post->ID, 'example_rss_feed_post_type', true );
                    $feed_post_status = get_post_meta( $rss_feeds->post->ID, 'example_rss_feed_post_status', true );

                    // Check if this is being accessed through admin
                    if ( !defined( 'DOING_CRON' ) ) {

                        // Output feed details
                        WP_CLI::line( 'Importing Feed #' . $rss_feed_count . '...' );
                        WP_CLI::line( 'Feed Name: ' . $feed_title );
                        WP_CLI::line( 'Feed URL: ' . $feed_url );
                        WP_CLI::line( 'Import to Post Type: ' . $feed_post_type );
                        WP_CLI::line( 'Import with Status: ' . $feed_post_status );
                        WP_CLI::line( ' ' );

                    }

                    // Get the RSS feed using SimpleXML
                    $rss_feed = simplexml_load_file($feed_url);

                    // Set the item count
                    $rss_feed_item_count = 0;

                    // Check the feed is not empty
                    if (!empty($rss_feed)) {

                        // Check if this is being accessed through admin
                        if ( !defined( 'DOING_CRON' ) ) {

                            // Output message
                            WP_CLI::line( 'Starting import...' );

                        }

                        // Loop through each item in the feed
                        foreach ($rss_feed->channel->item as $item) {

                            // Get the post id from the guid
                            $guid_post_id = substr( $item->guid, strrpos( $item->guid, '=' ) + 1 );

                            // Clean up the guid for inserting/selecting from database
                            $guid = esc_url_raw( $item->guid );

                            // Query arguments for checking if post has already been imported
                            $existing_post_args = array(
                                'post_type' => $feed_post_type,
                                'meta_query' => array(
                                    array(
                                        'key' => '_example_rss_import_original_post_id',
                                        'value' => esc_url_raw($guid),
                                        'compare' => '=',
                                    ),
                                ),
                            );

                            // Run the query to check if post has already been imported
                            $existing_post = new WP_Query( $existing_post_args );

                            // Check if there were results (there should only be one)
                            if ( $existing_post->have_posts() ) {

                                // Check if this is being accessed through admin
                                if ( !defined( 'DOING_CRON' ) ) {

                                    // Output message
                                    WP_CLI::line( '...skipped... ' . $guid . ' already exists!' );

                                }

                            } else {

                                // Change date format for insert into the post
                                $post_date = date( "Y-m-d H:i:s", strtotime( $item->pubDate ) );

                                // Remove CDATA tags from relevant items
                                $post_content = $item->children("content", true)->encoded;
                                $post_excerpt = $item->description;

                                // Strip any tags from fields
                                $post_title = wp_strip_all_tags( $item->title );

                                // Create array of post information
                                $post_arr = array(
                                    'post_author' => 0,
                                    'post_date' => $post_date,
                                    'post_title' => $post_title,
                                    'post_excerpt' => $post_excerpt,
                                    'post_type' => $feed_post_type,
                                    'post_content' => $post_content,
                                    'post_status' => $feed_post_status,
                                );

                                // Insert into the post type
                                $new_post_id = wp_insert_post( $post_arr );

                                // Add custom meta information to post
                                add_post_meta( $new_post_id, '_example_rss_import_original_post_id', esc_url_raw($guid) );
                                add_post_meta( $new_post_id, '_example_rss_import_original_link', esc_url_raw($item->link) );

                                // Check if there is a category on this item
                                if  (!empty($post_original_default_category = $item->category)) {

                                    //NOTE: Right now we're storing the first category returned in the feed as we don't know which category is the default, we store this in a custom meta field to be used for display
                                    // Add custom post meta to hold first returned category
                                    add_post_meta( $new_post_id, '_example_rss_import_original_default_category', $post_original_default_category );

                                }

                                // Check an image exists and add to the post
                                if (!empty($post_original_featured_image = $item->image)) {

                                    //NOTE: Right now we're storing the featured image on a custom post_meta but in the future we may need to expand this section to upload the image to the local media library
                                    // Add custom post meta to hold featured image
                                    add_post_meta( $new_post_id, '_example_rss_import_original_featured_image', esc_url_raw($post_original_featured_image) );

                                }

                                // Check if this is being accessed through admin
                                if ( !defined( 'DOING_CRON' ) ) {

                                    // Output message
                                    WP_CLI::line( ' - ' . $guid . ' imported!' );

                                }

                                // Increment feed item count
                                $rss_feed_item_count++;

                            }

                        }

                        // Update last import date
                        add_post_meta( $rss_feeds->post->ID, 'as_rss_feed_last_import', date('Y-m-d H:i:s') );

                        // Check if this is being accessed through admin
                        if ( !defined( 'DOING_CRON' ) ) {

                            // Output message
                            WP_CLI::success( 'Imported ' . $rss_feed_item_count . ' new posts');

                        }

                    } else {

                        // Check if this is being accessed through admin
                        if ( !defined( 'DOING_CRON' ) ) {

                            // Output warning that this feed has no content
                            WP_CLI::warning( 'Feed is empty, nothing imported' );

                        }

                    }

                    // Check if this is being accessed through admin
                    if ( !defined( 'DOING_CRON' ) ) {

                        WP_CLI::line( ' ' );

                    }

                    // Increment feed count
                    $rss_feed_count++;

                }

            } else {

                // Check if this is being accessed through admin
                if ( !defined( 'DOING_CRON' ) ) {

                    // Output to the CLI
                    WP_CLI::warning("Uh oh, there aren't any feeds configured. You can add some by logging into the admin back-end and going to RSS Importer > Add RSS Feed");

                }

            }

        }

    }

    // Check if this is being accessed through admin
    if ( !defined( 'DOING_CRON' ) ) {

        WP_CLI::add_command( 'rss_import', 'rss_import' );

    }

}

Содержимое функция, которая выполняется cron (я не включил другой код, который устанавливает расписание и событие WP-Cron, так как все это работает правильно):

// Run WP-CLI task
function example_rss_import_cron_exec() {
    $rss_import = new rss_import();
    $rss_import->sync();
}
add_action( 'example_rss_import_cron_hook', 'example_rss_import_cron_exec' );

Появляется выше для успешного выполнения в соответствии с плагином WP-Crontrol, но я не получаю ошибок в журналах или выводе на экран, и я также не уверен, является ли это правильным или правильным способом запуска команд в моем расширенном классе WP-CLI.

Любые советы или указатели буду признателен.

Внимание! Смена хостинг-провайдера мне не доступна, поэтому, пожалуйста, не предлагайте это в качестве решения

...