'shortcode', 'atts' => $atts, 'content' => $content, 'shortcode' => $shortcode ?: $tag, ); if ( ! self::conditions_allow_execution( $snippet, $context ) ) { return ''; } $result = self::execute_runtime_snippet( $snippet, $context, false ); if ( ! empty( $result['output'] ) ) { return $result['output']; } return $result['result_dump'] ?? ''; } ); } } /** * Fetch and cache runtime snippets list. * * @return array * * @since 4.3.0 */ private static function get_runtime_snippets(): array { if ( null !== self::$runtime_snippets ) { return self::$runtime_snippets; } self::$runtime_snippets = Snippet_Entity::get_runtime_snippets(); return self::$runtime_snippets; } /** * Execute snippet when current scope allows it. * * @param array $snippet Snippet row. * * @since 4.3.0 */ private static function maybe_execute_runtime_snippet( array $snippet ): void { if ( ! self::should_execute_in_context( $snippet ) ) { return; } $context = array( 'trigger' => 'hook', 'hook' => $snippet['execution_hook'] ?? '', ); if ( ! self::conditions_allow_execution( $snippet, $context ) ) { return; } self::execute_runtime_snippet( $snippet, $context ); } /** * Decide whether snippet should execute for current request. * * @param array $snippet Snippet row. */ private static function should_execute_in_context( array $snippet ): bool { $scope = (string) ( $snippet['execution_scope'] ?? Snippet_Entity::SCOPE_EVERYWHERE ); switch ( $scope ) { case Snippet_Entity::SCOPE_ADMIN: return \is_admin(); case Snippet_Entity::SCOPE_FRONTEND: return ! \is_admin() || \wp_doing_ajax(); case Snippet_Entity::SCOPE_MANUAL: return false; default: return true; } } /** * Evaluate stored run conditions for a snippet. * * @param array $snippet Snippet row. * @param array $context Runtime context (hook, trigger, shortcode, etc). * * @since 4.3.0 */ private static function conditions_allow_execution( array $snippet, array $context = array() ): bool { $raw = isset( $snippet['run_conditions'] ) ? (string) $snippet['run_conditions'] : ''; if ( '' === trim( $raw ) ) { return true; } $context = array_merge( array( 'snippet_id' => $snippet['id'] ?? 0, 'snippet_name' => $snippet['name'] ?? '', ), $context ); return Snippet_Condition_Evaluator::evaluate( $raw, $context ); } /** * Execute snippet via sandbox and persist last run metadata. * * @param array $snippet Snippet row data. * @param array $context Execution context. * @param bool $echo_output Whether to echo STDOUT. * * @return array Execution payload. * * @since 4.3.0 */ private static function execute_runtime_snippet( array $snippet, array $context = array(), bool $echo_output = true ): array { $code = (string) ( $snippet['code'] ?? '' ); if ( '' === trim( $code ) ) { return array( 'status' => 'skipped', 'message' => '', 'output' => '', 'duration' => 0, 'result_dump' => '', ); } $payload = array_merge( array( 'snippet' => array( 'id' => (int) ( $snippet['id'] ?? 0 ), 'name' => $snippet['name'] ?? '', 'scope' => $snippet['execution_scope'] ?? Snippet_Entity::SCOPE_EVERYWHERE, ), 'conditions' => $snippet['run_conditions'] ?? '', ), $context ); $result = Snippets_Sandbox::execute_runtime( $code, $payload ); $status = (string) ( $result['status'] ?? '' ); $message = (string) ( $result['message'] ?? '' ); if ( '' === $message && isset( $result['result_dump'] ) ) { $message = (string) $result['result_dump']; } if ( isset( $snippet['id'] ) ) { Snippet_Entity::store_execution_result( (int) $snippet['id'], $status, $message ); } if ( $echo_output && ! empty( $result['output'] ) ) { echo \wp_kses_post( $result['output'] ); } return $result; } } }