Я написал собственный плагин 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.
Любые советы или указатели буду признателен.
Внимание! Смена хостинг-провайдера мне не доступна, поэтому, пожалуйста, не предлагайте это в качестве решения