'GET', 'callback' => array( $this, 'get' ), 'permission_callback' => static fn(): bool => current_user_can( 'manage_options' ), ), array( 'methods' => 'PUT', 'callback' => array( $this, 'update' ), 'permission_callback' => static fn(): bool => current_user_can( 'manage_options' ), 'args' => array( 'enabled' => array( 'type' => 'boolean' ), 'blocked' => array( 'type' => 'array' ), 'log' => array( 'type' => 'boolean' ), 'enforce' => array( 'type' => 'boolean' ), ), ), ) ); // Read the robots.txt the site really serves and check the rules are // in it. Writing a rule and serving it are different things. register_rest_route( self::NAMESPACE, '/crawlers/verify', array( 'methods' => 'POST', 'permission_callback' => static function () { if ( ! current_user_can( 'manage_options' ) ) { return self::forbidden(); } return self::spend( 'crawlerverify', 60 ); }, 'callback' => function () { $settings = $this->options->get( 'crawler_controls', CrawlerControlsModule::defaults() ); return new WP_REST_Response( \AiRankSuite\Modules\CrawlerControls\Services\CrawlerLog::verify( (array) $settings['blocked'] ) ); }, ) ); register_rest_route( self::NAMESPACE, '/crawlers/traffic', array( 'methods' => 'DELETE', 'permission_callback' => static fn(): bool => current_user_can( 'manage_options' ), 'callback' => function () { \AiRankSuite\Modules\CrawlerControls\Services\CrawlerLog::reset(); $settings = $this->options->get( 'crawler_controls', CrawlerControlsModule::defaults() ); return new WP_REST_Response( \AiRankSuite\Modules\CrawlerControls\Services\CrawlerLog::report( (array) $settings['blocked'] ) ); }, ) ); } public function get(): WP_REST_Response { $settings = $this->options->get( 'crawler_controls', CrawlerControlsModule::defaults() ); $physical = file_exists( trailingslashit( ABSPATH ) . 'robots.txt' ); return new WP_REST_Response( array( 'settings' => $settings, 'bots' => CrawlerControlsModule::bots(), 'robots_url' => home_url( '/robots.txt' ), 'physical_robots_txt' => $physical, // What actually arrived, so the matrix is a set of decisions // with evidence behind them rather than guesses. 'traffic' => \AiRankSuite\Modules\CrawlerControls\Services\CrawlerLog::report( (array) $settings['blocked'] ), ) ); } public function update( WP_REST_Request $request ): WP_REST_Response { $defaults = CrawlerControlsModule::defaults(); $values = array(); if ( $request->has_param( 'enabled' ) ) { $values['enabled'] = (bool) $request->get_param( 'enabled' ); } if ( $request->has_param( 'blocked' ) ) { $known = array_keys( CrawlerControlsModule::bots() ); $values['blocked'] = array_values( array_intersect( (array) $request->get_param( 'blocked' ), $known ) ); } $this->options->set( 'crawler_controls', $values, $defaults ); return $this->get(); } }