postPingAction, [ $this, 'pingPost' ] ); add_action( $this->termPingAction, [ $this, 'pingTerm' ] ); if ( ! is_admin() ) { return; } if ( wp_doing_cron() ) { return; } // This action runs on ajax, so we need to move it up. add_action( 'pre_delete_term', [ $this, 'scheduleTerm' ], 1000 ); add_action( 'create_term', [ $this, 'scheduleTerm' ], 1000 ); if ( wp_doing_ajax() ) { return; } // Ping IndexNow on each post update. add_action( 'save_post', [ $this, 'schedulePost' ], 1000, 2 ); add_action( 'delete_post', [ $this, 'schedulePost' ], 1000, 2 ); // Ping IndexNow on each term update. add_action( 'edited_term', [ $this, 'scheduleTerm' ], 1000 ); } /** * Schedules an IndexNow ping for a post. * * @since 1.0.0 * * @param integer $postId The ID of the post. * @param \WP_Post $post The post object. * @return void */ public function schedulePost( $postId, $post = null ) { if ( ! aioseo()->helpers->isValidPost( $post, [ 'publish', 'trash' ] ) ) { return; } // If Limit Modified Date is enabled, let's return early. $aioseoPost = Models\Post::getPost( $postId ); if ( $aioseoPost->limit_modified_date ) { return; } // Since this is a post, let's check if it's noindexed. aioseo()->meta->robots->post( $post ); $meta = aioseo()->meta->robots->metaHelper( true ); if ( ! empty( $meta['noindex'] ) ) { return; } $permalink = get_permalink( $postId ); if ( 'trash' === $post->post_status ) { // We need to clone the post here so we can get a real permalink for the post even if it is not published already. $clonedPost = clone $post; $clonedPost->post_status = 'publish'; $clonedPost->post_name = sanitize_title( $clonedPost->post_name ? $clonedPost->post_name : $clonedPost->post_title, $clonedPost->ID ); $permalink = str_replace( '__trashed', '', get_permalink( $clonedPost ) ); } if ( aioseo()->actionScheduler->isScheduled( $this->postPingAction, [ 'permalink' => $permalink ] ) ) { return; } // Schedule the new ping. aioseo()->actionScheduler->scheduleAsync( $this->postPingAction, [ 'permalink' => $permalink ] ); } /** * Schedules an IndexNow ping for a term. * * @since 1.0.0 * * @param integer $termId The ID of the post. * @return void */ public function scheduleTerm( $termId ) { // Since this is a post, let's check if it's noindexed. $term = get_term( $termId ); if ( ! is_a( $term, 'WP_Term' ) ) { return; } aioseo()->meta->robots->term( $term ); $meta = aioseo()->meta->robots->metaHelper( true ); if ( ! empty( $meta['noindex'] ) ) { return; } if ( aioseo()->actionScheduler->isScheduled( $this->termPingAction, [ 'termLink' => get_term_link( $term->term_id ) ] ) ) { return; } // Schedule the new ping. aioseo()->actionScheduler->scheduleAsync( $this->termPingAction, [ 'termLink' => get_term_link( $term->term_id ) ] ); } /** * Pings search engines via IndexNow when a post is updated. * * @since 1.0.0 * * @param int $permalink The permalink of the post we want to update. * @return void */ public function pingPost( $permalink ) { // If the keys is missing, let's go ahead and return early. $apiKey = aioseoIndexNow()->options->indexNow->apiKey; if ( empty( $apiKey ) ) { return; } // Return early if we have recently sent this request. $postRecentlySent = aioseoIndexNow()->cache->get( 'post_recently_sent_' . sha1( $permalink ) ); if ( null !== $postRecentlySent ) { return; } aioseoIndexNow()->cache->update( 'post_recently_sent_' . sha1( $permalink ), time(), 11 * MINUTE_IN_SECONDS ); wp_remote_post( $this->getUrl(), $this->getPostData( [ $permalink ] ) ); } /** * Pings search engines via IndexNow when a term is updated. * * @since 1.0.0 * * @param string $termLink The term URL we want to update. * @return void */ public function pingTerm( $termLink ) { // If the keys is missing, let's go ahead and return early. $apiKey = aioseoIndexNow()->options->indexNow->apiKey; if ( empty( $apiKey ) ) { return; } // Return early if we have recently sent this request. $termRecentlySent = aioseoIndexNow()->cache->get( 'term_recently_sent_' . sha1( $termLink ) ); if ( null !== $termRecentlySent ) { return; } aioseoIndexNow()->cache->update( 'term_recently_sent_' . sha1( $termLink ), time(), 11 * MINUTE_IN_SECONDS ); wp_remote_post( $this->getUrl(), $this->getPostData( [ $termLink ] ) ); } /** * Returns the data to send to IndexNow. * * @since 1.0.7 * * @param string $urls The URLs to send to IndexNow. * @return array The data to send to IndexNow. */ private function getPostData( $urls ) { $apiKey = aioseoIndexNow()->options->indexNow->apiKey; return [ 'headers' => [ 'Content-Type' => 'application/json', 'X-Source-Info' => 'https://aioseo.com/' . AIOSEO_VERSION . '/false' ], 'body' => wp_json_encode( [ 'host' => aioseo()->helpers->getSiteDomain(), 'key' => $apiKey, 'urlList' => $urls ] ) ]; } /** * Returns the URL for the remote endpoint we're pinging. * * @since 1.0.0 * * @return string */ private function getUrl() { if ( defined( 'AIOSEO_INDEX_NOW_API_URL' ) ) { return AIOSEO_INDEX_NOW_API_URL; } return $this->baseUrl; } }