/**
  * Renderer for the Metabox.
  */
 public static function render_meta_box()
 {
     $post_id = intval(filter_input(INPUT_POST, 'post_ID'));
     $post = get_post($post_id);
     $adapter = new Instant_Articles_Post($post);
     $article = $adapter->to_instant_article();
     $canonical_url = $adapter->get_canonical_url();
     $submission_status = null;
     $published = 'publish' === $post->post_status;
     Instant_Articles_Wizard::menu_items();
     $settings_page_href = Instant_Articles_Wizard::get_url();
     if ($published) {
         try {
             $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
             $fb_page_settings = Instant_Articles_Option_FB_Page::get_option_decoded();
             if (isset($fb_app_settings['app_id']) && isset($fb_app_settings['app_secret']) && isset($fb_page_settings['page_access_token']) && isset($fb_page_settings['page_id'])) {
                 // Instantiate a new Client to get the status of this article.
                 $client = Client::create($fb_app_settings['app_id'], $fb_app_settings['app_secret'], $fb_page_settings['page_access_token'], $fb_page_settings['page_id']);
                 $submission_status_id = get_post_meta($post_id, Instant_Articles_Publisher::SUBMISSION_ID_KEY, true);
                 if (!empty($submission_status_id)) {
                     $submission_status = $client->getSubmissionStatus($submission_status_id);
                 } else {
                     // Grab the latest status of this article and display.
                     $article_id = $client->getArticleIDFromCanonicalURL($canonical_url);
                     $submission_status = $client->getLastSubmissionStatus($article_id);
                 }
             }
         } catch (FacebookResponseException $e) {
             $submission_status = null;
         }
     }
     include dirname(__FILE__) . '/meta-box-template.php';
     die;
 }
 public static function getClient()
 {
     if (!static::isPageSet()) {
         return null;
     }
     $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
     $fb_page_settings = Instant_Articles_Option_FB_Page::get_option_decoded();
     $client = Client::create($fb_app_settings['app_id'], $fb_app_settings['app_secret'], $fb_page_settings['page_access_token'], $fb_page_settings['page_id'], false);
     return $client;
 }
 /**
  * Constructor for Settings page.
  *
  * @since 0.4
  */
 public function __construct()
 {
     $this->fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
     if (isset($this->fb_app_settings['app_id']) && isset($this->fb_app_settings['app_secret'])) {
         $app_id = $this->fb_app_settings['app_id'];
         $app_secret = $this->fb_app_settings['app_secret'];
     }
     if (!empty($app_id) && !empty($app_secret)) {
         $this->fb_sdk = new Facebook\Facebook(array('app_id' => $app_id, 'app_secret' => $app_secret, 'default_graph_version' => 'v2.6', 'persistent_data_handler' => $this));
     }
 }
 /**
  * Returns the current step for the wizard.
  *
  * @since 0.5
  */
 public static function get_current_step_id()
 {
     $fb_page_settings = Instant_Articles_Option_FB_Page::get_option_decoded();
     $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
     if (empty($fb_app_settings['app_id']) || empty($fb_app_settings['app_secret'])) {
         return self::STEP_ID_APP_SETUP;
     } elseif (empty($fb_page_settings['page_id']) || empty($fb_page_settings['page_name'])) {
         return self::STEP_ID_PAGE_SELECTION;
     } else {
         return self::STEP_ID_DONE;
     }
 }
 /**
  * Renderer for the Metabox.
  */
 public static function render_meta_box()
 {
     $ajax_nonce = wp_create_nonce("instant-articles-force-submit");
     $post_id = intval($_POST['post_ID']);
     $post = get_post($post_id);
     $adapter = new Instant_Articles_Post($post);
     $article = $adapter->to_instant_article();
     $canonical_url = $adapter->get_canonical_url();
     $submission_status = null;
     $published = 'publish' === $post->post_status;
     $dev_mode = false;
     $force_submit = get_post_meta($post_id, Instant_Articles_Publisher::FORCE_SUBMIT_KEY, true);
     $should_submit_post = apply_filters('instant_articles_should_submit_post', true, $adapter);
     Instant_Articles_Wizard::menu_items();
     $settings_page_href = Instant_Articles_Wizard::get_url();
     $publishing_settings = Instant_Articles_Option_Publishing::get_option_decoded();
     $publish_with_warnings = $publishing_settings['publish_with_warnings'];
     if ($published) {
         try {
             $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
             $fb_page_settings = Instant_Articles_Option_FB_Page::get_option_decoded();
             $publishing_settings = Instant_Articles_Option_Publishing::get_option_decoded();
             $dev_mode = isset($publishing_settings['dev_mode']) ? $publishing_settings['dev_mode'] ? true : false : false;
             if (isset($fb_app_settings['app_id']) && isset($fb_app_settings['app_secret']) && isset($fb_page_settings['page_access_token']) && isset($fb_page_settings['page_id'])) {
                 // Instantiate a new Client to get the status of this article.
                 $client = Client::create($fb_app_settings['app_id'], $fb_app_settings['app_secret'], $fb_page_settings['page_access_token'], $fb_page_settings['page_id'], $dev_mode);
                 $submission_status_id = get_post_meta($post_id, Instant_Articles_Publisher::SUBMISSION_ID_KEY, true);
                 if (!empty($submission_status_id)) {
                     $submission_status = $client->getSubmissionStatus($submission_status_id);
                 } else {
                     // Grab the latest status of this article and display.
                     $article_id = $client->getArticleIDFromCanonicalURL($canonical_url);
                     $submission_status = $client->getLastSubmissionStatus($article_id);
                 }
             }
         } catch (FacebookResponseException $e) {
             $submission_status = null;
         }
     }
     include dirname(__FILE__) . '/meta-box-template.php';
     die;
 }
 /**
  * Submits article to Instant Articles.
  *
  * @param string $post_id The identifier of post.
  * @param Post   $post The WP Post.
  */
 public static function submit_article($post_id, $post)
 {
     // Don't process if this is just a revision or an autosave.
     if (wp_is_post_revision($post) || wp_is_post_autosave($post)) {
         return;
     }
     // Don't process if this post is not published
     if ('publish' !== $post->post_status) {
         return;
     }
     // Only process posts
     $post_types = apply_filters('instant_articles_post_types', array('post'));
     if (!in_array($post->post_type, $post_types)) {
         return;
     }
     // Transform the post to an Instant Article.
     $adapter = new Instant_Articles_Post($post);
     $article = $adapter->to_instant_article();
     // Skip empty articles or articles missing title.
     // This is important because the save_post action is also triggered by bulk updates, but in this case
     // WordPress does not load the content field from DB for performance reasons. In this case, articles
     // will be empty here, despite of them actually having content.
     if (count($article->getChildren()) === 0 || !$article->getHeader() || !$article->getHeader()->getTitle()) {
         return;
     }
     // Instantiate an API client.
     try {
         $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
         $fb_page_settings = Instant_Articles_Option_FB_Page::get_option_decoded();
         $publishing_settings = Instant_Articles_Option_Publishing::get_option_decoded();
         $dev_mode = isset($publishing_settings['dev_mode']) ? $publishing_settings['dev_mode'] ? true : false : false;
         if (isset($fb_app_settings['app_id']) && isset($fb_app_settings['app_secret']) && isset($fb_page_settings['page_access_token']) && isset($fb_page_settings['page_id'])) {
             $client = Client::create($fb_app_settings['app_id'], $fb_app_settings['app_secret'], $fb_page_settings['page_access_token'], $fb_page_settings['page_id'], $dev_mode);
             // Don't publish posts with password protection
             if (post_password_required($post)) {
                 // Unpublishes if already published and from now on it started to have password protection
                 $client->removeArticle($article->getCanonicalURL());
                 delete_post_meta($post_id, self::SUBMISSION_ID_KEY);
                 return;
             }
             // Don't process if contains warnings and blocker flag for transformation warnings is turned on.
             if (count($adapter->transformer->getWarnings()) > 0 && isset($publishing_settings['block_publish_with_warnings']) && $publishing_settings['block_publish_with_warnings']) {
                 // Unpublishes if already published
                 $client->removeArticle($article->getCanonicalURL());
                 delete_post_meta($post_id, self::SUBMISSION_ID_KEY);
                 return;
             }
             if ($dev_mode) {
                 $published = false;
             } else {
                 // Any publish status other than 'publish' means draft for the Instant Article.
                 $published = true;
             }
             try {
                 // Import the article.
                 $submission_id = $client->importArticle($article, $published);
                 update_post_meta($post_id, self::SUBMISSION_ID_KEY, $submission_id);
             } catch (Exception $e) {
                 // Try without taking live for pages not yet reviewed.
                 $submission_id = $client->importArticle($article, false);
                 update_post_meta($post_id, self::SUBMISSION_ID_KEY, $submission_id);
             }
         }
     } catch (Exception $e) {
         Logger::getLogger('instantarticles-wp-plugin')->error('Unable to submit article.', $e->getTraceAsString());
     }
 }
 /**
  * Transition for when the user decides to change the selected page.
  */
 private static function transition_edit_page()
 {
     Instant_Articles_Option_FB_Page::delete_option();
     // For backwards compatibility, we transition one step back
     // for users of the old versions that selected a page but the
     // plugin didn't save the user access token. In this case
     // we need the user to log in again.
     $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
     $user_logged_in = !empty($fb_app_settings['user_access_token']);
     if (!$user_logged_in) {
         return update_option('instant-articles-current-state', self::STATE_APP_SETUP);
     }
     return update_option('instant-articles-current-state', self::STATE_PAGE_SELECTION);
 }
 public static function render($ajax = false)
 {
     if (!current_user_can('manage_options')) {
         wp_die(esc_html('You do not have sufficient permissions to access this page.'));
     }
     // Read options (they are used on the templates)
     $current_state = Instant_Articles_Wizard_State::get_current_state();
     $fb_page_settings = Instant_Articles_Option_FB_Page::get_option_decoded();
     $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
     $fb_helper = new Instant_Articles_Wizard_FB_Helper();
     $settings_url = self::get_url();
     // Handle redirection from Login flow
     // ----------------------------------
     // Only during STATE_APP_SETUP
     if ($current_state === Instant_Articles_Wizard_State::STATE_APP_SETUP) {
         $user_access_token = $fb_helper->get_fb_access_token();
         $permissions = $fb_helper->get_fb_permissions($user_access_token);
         // Trigger transition if all needed permissions are granted
         if ($user_access_token && isset($permissions['pages_manage_instant_articles']) && isset($permissions['pages_show_list'])) {
             Instant_Articles_Wizard_State::do_transition(Instant_Articles_Wizard_State::STATE_PAGE_SELECTION, array('app_id' => $fb_app_settings['app_id'], 'app_secret' => $fb_app_settings['app_secret'], 'user_access_token' => $user_access_token->getValue()));
             // Override step
             $current_state = Instant_Articles_Wizard_State::get_current_state();
         }
     }
     // ----------------------------------
     // Grabs the current configured style
     // ----------------------------------
     // Only during STATE_STYLE_SELECTION
     if ($current_state === Instant_Articles_Wizard_State::STATE_STYLE_SELECTION) {
         $settings_style = Instant_Articles_Option_Styles::get_option_decoded();
         if (isset($settings_style['article_style']) && !empty($settings_style['article_style'])) {
             $article_style = $settings_style['article_style'];
         } else {
             $article_style = 'default';
         }
     }
     // ----------------------------------
     // Check submission status
     // ----------------------------------
     // Only during STATE_REVIEW_SUBMISSION
     if ($current_state === Instant_Articles_Wizard_State::STATE_REVIEW_SUBMISSION) {
         $review_submission_status = Instant_Articles_Wizard_Review_Submission::getReviewSubmissionStatus();
         if ($review_submission_status === Instant_Articles_Wizard_Review_Submission::STATUS_NOT_SUBMITTED) {
             $articles_for_review = Instant_Articles_Wizard_Review_Submission::getArticlesForReview();
         }
     }
     // ----------------------------------
     include dirname(__FILE__) . '/templates/wizard-template.php';
 }
 public static function render($ajax = false)
 {
     if (!current_user_can('manage_options')) {
         wp_die(esc_html('You do not have sufficient permissions to access this page.'));
     }
     try {
         // Read options (they are used on the templates)
         $current_state = Instant_Articles_Wizard_State::get_current_state();
         $fb_page_settings = Instant_Articles_Option_FB_Page::get_option_decoded();
         $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
         $fb_helper = new Instant_Articles_Wizard_FB_Helper();
         $settings_url = self::get_url();
         // Handle redirection from Login flow
         // ----------------------------------
         // Only during STATE_APP_SETUP
         if ($current_state === Instant_Articles_Wizard_State::STATE_APP_SETUP) {
             $user_access_token = $fb_helper->get_fb_access_token();
             $permissions = $fb_helper->get_fb_permissions($user_access_token);
             // Trigger transition if all needed permissions are granted
             if ($user_access_token && isset($permissions['pages_manage_instant_articles']) && isset($permissions['pages_show_list'])) {
                 Instant_Articles_Wizard_State::do_transition(Instant_Articles_Wizard_State::STATE_PAGE_SELECTION, array('app_id' => $fb_app_settings['app_id'], 'app_secret' => $fb_app_settings['app_secret'], 'user_access_token' => $user_access_token->getValue()));
                 // Override step
                 $current_state = Instant_Articles_Wizard_State::get_current_state();
             }
         }
         // ----------------------------------
         // Handle redirection from Login flow
         // ----------------------------------
         // Only during STATE_PAGE_SELECTION
         if ($current_state === Instant_Articles_Wizard_State::STATE_PAGE_SELECTION) {
             $fb_helper = new Instant_Articles_Wizard_FB_Helper();
             try {
                 $pages = $fb_helper->get_pages();
             } catch (Exception $e) {
                 // If we couldn't fetch the pages, revert to the App setup
                 Instant_Articles_Wizard_State::do_transition(Instant_Articles_Wizard_State::STATE_APP_SETUP);
             }
         }
         // Grabs the current configured style
         // ----------------------------------
         // Only during STATE_STYLE_SELECTION
         if ($current_state === Instant_Articles_Wizard_State::STATE_STYLE_SELECTION) {
             $settings_style = Instant_Articles_Option_Styles::get_option_decoded();
             if (isset($settings_style['article_style']) && !empty($settings_style['article_style'])) {
                 $article_style = $settings_style['article_style'];
             } else {
                 $article_style = 'default';
             }
         }
         // ----------------------------------
         // Check submission status
         // ----------------------------------
         // Only during STATE_REVIEW_SUBMISSION
         if ($current_state === Instant_Articles_Wizard_State::STATE_REVIEW_SUBMISSION) {
             $review_submission_status = Instant_Articles_Wizard_Review_Submission::getReviewSubmissionStatus();
             if ($review_submission_status === Instant_Articles_Wizard_Review_Submission::STATUS_NOT_SUBMITTED) {
                 $articles_for_review = Instant_Articles_Wizard_Review_Submission::getArticlesForReview();
                 // Map to Instant_Articles_Post instances
                 $instant_articles_for_review = array_map(function ($article) {
                     $instant_articles_post = new Instant_Articles_Post($article);
                     // Call transformation to load warnings
                     $instant_articles_post->to_instant_article();
                     return $instant_articles_post;
                 }, $articles_for_review);
                 // Filter articles with warnings and not forced
                 $instant_articles_with_warnings = array_filter($instant_articles_for_review, function ($article) {
                     $has_warnings = count($article->transformer->getWarnings()) > 0;
                     $force_submit = get_post_meta($article->get_the_id(), Instant_Articles_Publisher::FORCE_SUBMIT_KEY, true);
                     return $has_warnings && !$force_submit;
                 });
             }
         }
         // ----------------------------------
         include dirname(__FILE__) . '/templates/wizard-template.php';
     } catch (Exception $e) {
         if (Instant_Articles_Wizard_State::get_current_state() !== Instant_Articles_Wizard_State::STATE_APP_SETUP) {
             // Restarts the wizard
             Instant_Articles_Wizard_State::do_transition(Instant_Articles_Wizard_State::STATE_APP_SETUP);
             echo '<div class="error settings-error notice is-dismissible"><p><strong>' . esc_html('Error processing your request. Check server log for more details. Setup and login again to renew Application credentials. Error message: ' . $e->getMessage()) . '</strong></p></div>';
             Instant_Articles_Wizard::render($ajax, true);
         }
     }
 }
 public function get_pages()
 {
     $helper = new Facebook\InstantArticles\Client\Helper($this->fb_sdk);
     $fb_app_settings = Instant_Articles_Option_FB_App::get_option_decoded();
     $page_nodes = $helper->getPagesAndTokens(new Facebook\Authentication\AccessToken($fb_app_settings['user_access_token']))->all();
     $pages = array();
     // Map GraphNode objects to simple value objects that are smaller when serialized.
     foreach ($page_nodes as $page_node) {
         $pages[$page_node->getField('id')] = array('page_id' => $page_node->getField('id'), 'page_name' => $page_node->getField('name'), 'page_picture' => $page_node->getField('picture')->getField('url'), 'page_access_token' => $page_node->getField('access_token'), 'supports_instant_articles' => $page_node->getField('supports_instant_articles'));
     }
     return $pages;
 }