Home / Admin / Elementor Rest Bridge
Duplicate Snippet

Embed Snippet on Your Site

Elementor Rest Bridge

Code Preview
php
<?php
if (!defined('ABSPATH')) {
      exit;
  }
  add_action('init', function () {
      $post_types = array('page', 'post', 'elementor_library');
      foreach ($post_types as $pt) {
          register_post_meta($pt, '_elementor_data', array(
              'show_in_rest'  => true,
              'single'        => true,
              'type'          => 'string',
              'auth_callback' => function () {
                  return current_user_can('edit_posts');
              },
          ));
          register_post_meta($pt, '_elementor_page_settings', array(
              'show_in_rest'  => true,
              'single'        => true,
              'type'          => 'string',
              'auth_callback' => function () {
                  return current_user_can('edit_posts');
              },
          ));
          register_post_meta($pt, '_elementor_edit_mode', array(
              'show_in_rest'  => true,
              'single'        => true,
              'type'          => 'string',
              'auth_callback' => function () {
                  return current_user_can('edit_posts');
              },
          ));
          register_post_meta($pt, '_elementor_template_type', array(
              'show_in_rest'  => true,
              'single'        => true,
              'type'          => 'string',
              'auth_callback' => function () {
                  return current_user_can('edit_posts');
              },
          ));
          register_post_meta($pt, '_elementor_css', array(
              'show_in_rest'  => true,
              'single'        => true,
              'type'          => 'string',
              'auth_callback' => function () {
                  return current_user_can('edit_posts');
              },
          ));
      }
  });
  add_action('rest_api_init', function () {
      register_rest_route('elementor-bridge/v1', '/regenerate-css/(?P<id>\d+)', array(
          'methods'             => 'POST',
          'permission_callback' => function () {
              return current_user_can('edit_posts');
          },
          'callback'            => function ($request) {
              $post_id = $request['id'];
              if (!get_post($post_id)) {
                  return new WP_Error('not_found', 'Post not found', array('status' => 404));
              }
              delete_post_meta($post_id, '_elementor_css');
              if (class_exists('\\Elementor\\Plugin')) {
                  $document = \Elementor\Plugin::$instance->documents->get($post_id);
                  if ($document) {
                      $css_file = \Elementor\Core\Files\CSS\Post::create($post_id);
                      $css_file->update();
                      return array('success' => true, 'message' => 'CSS regenerated via Elementor');
                  }
              }
              return array('success' => true, 'message' => 'CSS cache cleared');
          },
      ));
      register_rest_route('elementor-bridge/v1', '/pages', array(
          'methods'             => 'GET',
          'permission_callback' => function () {
              return current_user_can('edit_posts');
          },
          'callback'            => function () {
              $pages = get_posts(array(
                  'post_type'      => array('page', 'post', 'elementor_library'),
                  'posts_per_page' => -1,
                  'meta_key'       => '_elementor_edit_mode',
                  'meta_value'     => 'builder',
              ));
              $result = array();
              foreach ($pages as $page) {
                  $data = get_post_meta($page->ID, '_elementor_data', true);
                  $element_count = 0;
                  if ($data) {
                      $decoded = json_decode($data, true);
                      if (is_array($decoded)) {
                          $element_count = count_elementor_bridge_elements($decoded);
                      }
                  }
                  $result[] = array(
                      'id'             => $page->ID,
                      'title'          => $page->post_title,
                      'slug'           => $page->post_name,
                      'status'         => $page->post_status,
                      'type'           => $page->post_type,
                      'template_type'  => get_post_meta($page->ID, '_elementor_template_type', true),
                      'element_count'  => $element_count,
                      'modified'       => $page->post_modified,
                      'url'            => get_permalink($page->ID),
                  );
              }
              return $result;
          },
      ));
  });
  function count_elementor_bridge_elements($elements) {
      $count = count($elements);
      foreach ($elements as $el) {
          if (!empty($el['elements'])) {
              $count += count_elementor_bridge_elements($el['elements']);
          }
      }
      return $count;
  }

Comments

Add a Comment