public function run()
 {
     // Post Type Manager
     $post_type_manager = new RP4WP_Post_Type_Manager();
     $post_types = $post_type_manager->get_installed_post_types();
     // Add them for all post types
     if (count($post_types) > 0) {
         foreach ($post_types as $post_type => $pt_children) {
             new RP4WP_Meta_Box_Manage($post_type);
         }
     }
 }
 public function run()
 {
     // post type manager
     $pt_manager = new RP4WP_Post_Type_Manager();
     // get installed post types
     $post_types = $pt_manager->get_installed_post_types();
     // check & loop
     if (count($post_types) > 0) {
         foreach ($post_types as $parent => $children) {
             // add thumbnail for post type
             RP4WP_Thumbnail_Helper::get()->register_thumbnail_size($parent);
         }
     }
 }
 public function run()
 {
     // get installed post types
     $post_type_manager = new RP4WP_Post_Type_Manager();
     $instaled_post_types = $post_type_manager->get_installed_post_types();
     // store the installed post types
     $post_types = array();
     // loop and add
     foreach ($instaled_post_types as $instaled_post_type_children) {
         if (is_array($instaled_post_type_children) && count($instaled_post_type_children) > 0) {
             foreach ($instaled_post_type_children as $instaled_post_type_child) {
                 if (!in_array($instaled_post_type_child, $post_types)) {
                     $post_types[] = $instaled_post_type_child;
                 }
             }
         }
     }
     // add meta box
     foreach ($post_types as $post_type) {
         new RP4WP_Meta_Box_Options($post_type);
     }
 }
    /**
     * The screen content
     *
     * @since  1.0.0
     * @access public
     */
    public function content()
    {
        // Check nonce
        $installer_nonce = isset($_GET['rp4wp_nonce']) ? $_GET['rp4wp_nonce'] : '';
        if (!wp_verify_nonce($installer_nonce, RP4WP_Constants::NONCE_INSTALL)) {
            wp_die('Woah! It looks like something else tried to run the Related Posts for WordPress installation wizard! We were able to stop them, nothing was lost. Please report this incident at <a href="http://wordpress.org/support/plugin/related-posts-for-wp" target="_blank">our forums.</a>');
        }
        // The steps
        $steps = array(1 => __('Welcome', 'related-posts-for-wp'), 2 => __('Caching Posts', 'related-posts-for-wp'), 3 => __('Linking Posts', 'related-posts-for-wp'), 4 => __('Finished', 'related-posts-for-wp'));
        // What's the current step?
        $cur_step = intval(isset($_GET['step']) ? $_GET['step'] : 1);
        // Set the post type in var
        $post_type = esc_html(isset($_GET['pt']) ? $_GET['pt'] : '');
        // Check if the post type is set
        if ($cur_step > 1 && empty($post_type)) {
            wp_die(sprintf(__('Missing post type parameter, please report this incident via %sour website%s.', 'related-posts-for-wp'), '<a href="https://www.relatedpostsforwp.com/support/" target="_blank">', '</a>'));
        }
        // Try to create the cache table if we're in step 1 and this is a multisite
        if (1 == $cur_step && is_multisite()) {
            require_once plugin_dir_path(RP4WP_PLUGIN_FILE) . 'includes/installer-functions.php';
            rp4wp_premium_create_db_table();
        }
        // Check installer resume options
        if (2 == $cur_step) {
            // Add is installing site option
            add_option(RP4WP_Constants::OPTION_IS_INSTALLING, $post_type);
            // Get current linked post type
            $linked_pt_cur = absint(isset($_GET['cur']) ? $_GET['cur'] : 0);
            // Get the available post types
            $ptm = new RP4WP_Post_Type_Manager();
            $linked_pt_count = count($ptm->get_installed_post_type($post_type));
        } elseif (4 == $cur_step) {
            // Installer is done, remove the option
            delete_option(RP4WP_Constants::OPTION_IS_INSTALLING);
        }
        ?>
		<div class="wrap">
			<h2>Related Posts for WordPress <?php 
        _e('Installation', 'related-posts-for-wp');
        ?>
</h2>

			<ul class="install-steps">
				<?php 
        foreach ($steps as $step => $label) {
            echo "<li id='step-bar-" . $step . "'" . ($cur_step == $step ? " class='step-bar-active'" : "") . "><span>" . $step . '. ' . $label . "</span></li>" . PHP_EOL;
        }
        ?>
			</ul>
			<br class="clear" />

			<h3><?php 
        echo $steps[$cur_step];
        ?>
</h3>

			<?php 
        echo "<div class='rp4wp-step rp4wp-step-" . $cur_step . "' rel='" . $cur_step . "'>";
        // Hidden fields
        echo "<input type='hidden' id='rp4wp_admin_url' value='" . admin_url() . "' />" . PHP_EOL;
        // Echo the post type & total posts when post type is set
        if (!empty($post_type)) {
            echo "<input type='hidden' id='rp4wp_post_type' value='" . $post_type . "' />" . PHP_EOL;
            echo "<input type='hidden' id='rp4wp_total_posts' value='" . wp_count_posts($post_type)->publish . "' />" . PHP_EOL;
        }
        // Echo the amount of linked post types
        if (isset($linked_pt_count)) {
            echo "<input type='hidden' id='linked_pt_count' value='" . $linked_pt_count . "' />" . PHP_EOL;
        }
        // Echo the current linked post type
        if (isset($linked_pt_cur)) {
            echo "<input type='hidden' id='linked_pt_cur' value='" . $linked_pt_cur . "' />" . PHP_EOL;
        }
        // Echo the nonce
        if (!empty($installer_nonce)) {
            echo "<input type='hidden' id='rp4wp_nonce' value='" . $installer_nonce . "' />" . PHP_EOL;
        }
        // AJAX nonce
        echo '<input type="hidden" name="rp4wp-ajax-nonce" id="rp4wp-ajax-nonce" value="' . wp_create_nonce(RP4WP_Constants::NONCE_AJAX) . '" />';
        switch ($cur_step) {
            case 1:
                ?>
				<p><?php 
                _e('Thank you for choosing Related Posts for WordPress!', 'related-posts-for-wp');
                ?>
</p>
				<p><?php 
                _e("Below you'll find your post types available for installation, by installing a post type we'll set up a cache and offer you the ability to automatic link (custom) posts. To install a post type, simply click the 'Install Post Type' button.", 'related-posts-for-wp');
                ?>
</p>
				<h3>Post Types</h3>
				<?php 
                // Get the available post types
                $ptm = new RP4WP_Post_Type_Manager();
                // Get installed post types
                $installed_post_types = $ptm->get_installed_post_types();
                // Available post types
                $available_post_types = $ptm->get_available_post_types();
                echo '<input type="hidden" id="rp4wp-availabe_post_types" value="' . implode(',', array_keys($available_post_types)) . '" />';
                echo '<table cellpadding="0" cellspacing="0" border="0" class="rp4wp-table-pt-overview">' . PHP_EOL;
                echo "<tr>" . PHP_EOL;
                echo "<th>" . __('Post Type', 'related-posts-for-wp') . "</th>" . PHP_EOL;
                echo "<th>" . __('Related to Post Types', 'related-posts-for-wp') . "</th>" . PHP_EOL;
                echo "<th>&nbsp;</th>" . PHP_EOL;
                echo "</tr>" . PHP_EOL;
                // Da loop
                if (count($available_post_types) > 0) {
                    foreach ($available_post_types as $pt_key => $pt_label) {
                        $is_active = false;
                        if (isset($installed_post_types[$pt_key]) && count($installed_post_types[$pt_key]) > 0) {
                            $is_active = true;
                        }
                        echo '<tr rel="' . $pt_key . '" ' . (!$is_active ? 'class="inactive"' : '') . '>';
                        echo '<td class="rp4wp-parent">' . $pt_label . '</td>' . PHP_EOL;
                        echo '<td class="rp4wp-children">';
                        echo '<ul>' . PHP_EOL;
                        if ($is_active) {
                            foreach ($installed_post_types[$pt_key] as $linked_pt) {
                                echo '<li id="' . $linked_pt . '"><span>' . $available_post_types[$linked_pt] . '</span></li>' . PHP_EOL;
                            }
                        }
                        echo '</ul>' . PHP_EOL;
                        echo '</td>' . PHP_EOL;
                        echo '<td class="rp4wp-button">';
                        echo '<div class="rp4wp-buttons-wrap">' . PHP_EOL;
                        echo '<a href="javascript:;" class="button button-primary rp4wp-btn-edit rp4wp-has-tip" title="' . __('Edit this post type', 'related-posts-for-wp') . '" rel="edit"></a>';
                        echo '</div>' . PHP_EOL;
                        echo '</td>' . PHP_EOL;
                        echo '</tr>';
                    }
                }
                echo '</table>' . PHP_EOL;
                break;
            case 2:
                // Echo current uncached posts
                $related_word_manager = new RP4WP_Related_Word_Manager();
                // amount of posts needs caching
                $posts_todo = $related_word_manager->get_uncached_post_count($post_type);
                echo "<input type='hidden' id='rp4wp_posts_todo' value='" . $posts_todo . "' />" . PHP_EOL;
                ?>
				<p><?php 
                _e('Thank you for choosing Related Posts for WordPress!', 'related-posts-for-wp');
                ?>
</p>
				<p><?php 
                _e('Before you can start using Related Posts for WordPress we need to cache your current posts.', 'related-posts-for-wp');
                ?>
</p>
				<p><?php 
                _e("This is a one time process which might take some time now, depending on the amount of posts you have, but will ensure your website's performance when using the plugin.", 'related-posts-for-wp');
                ?>
</p>

				<p style="font-weight: bold;"><?php 
                _e('Do NOT close this window, wait for this process to finish and this wizard to take you to the next step.', 'related-posts-for-wp');
                ?>
</p>

				<div id="progress-container">
					<div id="progressbar"></div>
					<p>Todo: <span id="progress-todo"><?php 
                echo $posts_todo;
                ?>
</span></p>
					<p>Done: <span id="progress-done">0</span></p>
				</div>

				<?php 
                break;
            case 3:
                // Echo current unlinked posts
                $related_post_manager = new RP4WP_Related_Post_Manager();
                // amount of posts need linking
                $posts_todo = $related_post_manager->get_unlinked_post_count($post_type);
                echo "<input type='hidden' id='rp4wp_posts_todo' value='" . $posts_todo . "' />" . PHP_EOL;
                // Get the automatic linking post amount
                $alpa = 3;
                if (isset(RP4WP()->settings['general_' . $post_type])) {
                    $alpa = RP4WP()->settings['general_' . $post_type]->get_option('automatic_linking_post_amount');
                }
                // get the post age
                // Get the automatic linking post amount
                $max_post_age = 0;
                if (isset(RP4WP()->settings['general_' . $post_type])) {
                    $max_post_age = RP4WP()->settings['general_' . $post_type]->get_option('max_post_age');
                }
                ?>
				<p style="font-weight: bold;"><?php 
                _e('Great! All your posts were successfully cached!', 'related-posts-for-wp');
                ?>
</p>
				<p><?php 
                _e("You can let me link your posts, based on what I think is related, to each other. And don't worry, if I made a mistake at one of your posts you can easily correct this by editing it manually!", 'related-posts-for-wp');
                ?>
</p>
				<p><?php 
                _e('Want me to start linking posts to each other? Fill in the amount of related posts each post should have and click on the "Link now" button. Rather link your posts manually? Click "Skip linking".', 'related-posts-for-wp');
                ?>
</p>
				<p style="font-weight: bold;"><?php 
                _e('Do NOT close this window if you click the "Link now" button, wait for this process to finish and this wizard to take you to the next step.', 'related-posts-for-wp');
                ?>
</p>
				<br class="clear"/>

				<div class="rp4wp-install-link-box">
					<table cellpadding="0" cellspacing="0" border="0">
						<tr>
							<td><label for="rp4wp_related_posts_amount"><?php 
                _e('Amount of related posts:', 'related-posts-for-wp');
                ?>
</label></td>
							<td><input class="form-input-tip" type="text" id="rp4wp_related_posts_amount" value="<?php 
                echo $alpa;
                ?>
" /></td>
							<td class="rp4pw-install-step3-table-desc"><?php 
                printf(__('The amount of related items per %s', 'related-posts-for-wp'), $post_type);
                ?>
</td>
						</tr>


						<tr>
							<td><label for="rp4wp_related_posts_age"><?php 
                _e('Maximum Post Age:', 'related-posts-for-wp');
                ?>
</label></td>
							<td><input class="form-input-tip" type="text" id="rp4wp_related_posts_age" value="<?php 
                echo $max_post_age;
                ?>
"/></td>
							<td class="rp4pw-install-step3-table-desc"><?php 
                printf(__('The maximum age in days of %s that will be linked. (0 = unlimited)', 'related-posts-for-wp'), $post_type);
                ?>
</td>
						</tr>

						<tr>
							<td>&nbsp;</td>
							<td colspan="2" class="rp4pw-install-step3-table-buttons">
								<a href="javascript:;" class="button button-primary button-large rp4wp-link-now-btn" id="rp4wp-link-now"><?php 
                _e('Link now', 'related-posts-for-wp');
                ?>
</a>
								<a href="<?php 
                echo admin_url(sprintf('?page=rp4wp_install&step=4&pt=%s&&rp4wp_nonce=%s', $post_type, wp_create_nonce(RP4WP_Constants::NONCE_INSTALL)));
                ?>
" class="button"><?php 
                _e('Skip linking', 'related-posts-for-wp');
                ?>
</a>
							</td>
						</tr>

					</table>
				</div>

				<br class="clear"/>

				<div id="progress-container">
					<div id="progressbar"></div>
					<p>Todo: <span id="progress-todo"><?php 
                echo $posts_todo;
                ?>
</span></p>
					<p>Done: <span id="progress-done">0</span></p>
				</div>
				<?php 
                break;
            case 4:
                ?>
				<p><?php 
                _e("That's it, you're good to go!", 'related-posts-for-wp');
                ?>
</p>
				<p><?php 
                printf(__('Thanks again for using Related Posts for WordPress and if you have any questions be sure to ask them at the %sWordPress.org forums.%s', 'related-posts-for-wp'), '<a href="http://wordpress.org/support/plugin/related-posts-for-wp" target="_blank">', '</a>');
                ?>
</p>
				<p>
					<a href="<?php 
                echo admin_url(sprintf('?page=rp4wp_install&rp4wp_nonce=%s', wp_create_nonce(RP4WP_Constants::NONCE_INSTALL)));
                ?>
"
					   class="button button-primary"><?php 
                _e('Click here to return to step 1', 'related-posts-for-wp');
                ?>
</a>
				</p>
				<p>
					<?php 
                $local_settings = (array) RP4WP()->settings;
                $first_setting = array_shift($local_settings);
                echo '<a href="' . admin_url('options-general.php?page=' . $first_setting->get_page()) . '" class="button button-primary">' . __('Click here to go to the settings page', 'related-posts-for-wp') . '</a>';
                ?>
				</p>
			<?php 
        }
        ?>
		</div>

		</div>

	<?php 
    }
 /**
  * An update is required, do it
  *
  * @param $current_version
  */
 private function do_upgrade($current_version)
 {
     global $wpdb;
     // Upgrade to version 1.2.2
     if (version_compare($current_version, '1.2.2', '<')) {
         /**
          * Add a post type to currently existing links
          */
         // Get id's that need an upgrade
         $upgrade_ids = get_posts(array('post_type' => RP4WP_Constants::LINK_PT, 'fields' => 'ids', 'posts_per_page' => -1, 'meta_query' => array(array('key' => RP4WP_Constants::PM_PT_PARENT, 'value' => '1', 'compare' => 'NOT EXISTS'))));
         // Preparing the sql lines
         if (count($upgrade_ids) > 0) {
             $sql_lines = array();
             // Loop
             foreach ($upgrade_ids as $upgrade_id) {
                 $sql_lines[] = "(" . $upgrade_id . ", '" . RP4WP_Constants::PM_PT_PARENT . "', 'post')";
             }
             // Insert the rows
             $wpdb->query("INSERT INTO `{$wpdb->postmeta}` (`post_id`,`meta_key`,`meta_value`) VALUES" . implode(',', $sql_lines) . " ;");
         }
     }
     // Upgrade to 1.3.0
     if (version_compare($current_version, '1.3.0', '<')) {
         /**
          * Upgrade the 'rp4wp_installed_post_types' option
          */
         // Get old post types
         $old_installed_post_types = get_option(RP4WP_Constants::OPTION_INSTALLED_PT, array());
         // Check
         if (count($old_installed_post_types) > 0) {
             // New installed post types
             $installed_post_types = array();
             // Loop
             foreach ($old_installed_post_types as $old_installed_post_type => $old_installed_post_type_children) {
                 if (is_array($old_installed_post_type_children)) {
                     $installed_post_types[$old_installed_post_type] = $old_installed_post_type_children;
                 } else {
                     $installed_post_types[$old_installed_post_type_children] = array($old_installed_post_type_children);
                 }
             }
             // Set new option
             update_option(RP4WP_Constants::OPTION_INSTALLED_PT, $installed_post_types);
         }
         /**
          * Upgrade license key and email
          */
         // Fetch old license key and email
         $plugin_slug = str_replace('.php', '', basename(RP4WP_PLUGIN_FILE));
         $api_key = get_option($plugin_slug . '_licence_key', '');
         $activation_email = get_option($plugin_slug . '_email', '');
         // Check if values exist
         if ('' != $api_key && '' != $activation_email) {
             // Update option
             update_option('rp4wp_license', array('licence_key' => $api_key, 'email' => $activation_email));
             // Set local activation status to true
             RP4WP_Updater_Key_API::set_activated(true);
         }
     }
     // upgrade to 1.4.0, the configurator
     if (version_compare($current_version, '1.4.0', '<')) {
         // get installed post types
         $pt_manager = new RP4WP_Post_Type_Manager();
         $installed_post_types = $pt_manager->get_installed_post_types();
         // check
         if (count($installed_post_types) > 0) {
             // get first pt
             foreach ($installed_post_types as $settings_pt => $dump) {
                 break;
             }
             unset($dump);
             // get current theme option
             $theme_options = get_option('rp4wp_themes', array());
             // get settings
             $pt_settings = RP4WP::get()->settings['general_' . $settings_pt];
             // configurator options
             $configurator_options = array('posts_per_row' => isset($theme_options['theme']) && intval($theme_options['theme']) > 0 ? intval($theme_options['theme']) : 2, 'fixed_height' => 325, 'css' => isset($theme_options['css']) ? $theme_options['css'] : '');
             // get settings from first pt
             $display_image = intval($pt_settings->get_option('display_image'));
             $excerpt_length = intval($pt_settings->get_option('excerpt_length'));
             // set the right configuration
             if (1 == $display_image && $excerpt_length > 0) {
                 // image + title + excerpt
                 $configurator_options['configuration'] = '[{"type":"image","x":0,"y":0,"width":1,"height":5},{"type":"title","x":1,"y":0,"width":1,"height":2},{"type":"excerpt","x":1,"y":2,"width":1,"height":3}]';
             } else {
                 if (1 == $display_image) {
                     // title + image
                     $configurator_options['configuration'] = '[{"type":"title","x":0,"y":0,"width":2,"height":1},{"type":"image","x":0,"y":1,"width":2,"height":4}]';
                 } else {
                     if ($excerpt_length > 0) {
                         // title + excerpt
                         $configurator_options['configuration'] = '[{"type":"title","x":0,"y":0,"width":2,"height":1},{"type":"excerpt","x":0,"y":1,"width":2,"height":4}]';
                     } else {
                         // title only
                         $configurator_options['configuration'] = '[{"type":"title","x":0,"y":0,"width":2,"height":5}]';
                     }
                 }
             }
             // set configuration option
             update_option('rp4wp_configurator', $configurator_options);
             // delete old theme options
             delete_option('rp4wp_themes');
         }
     }
     // Upgrade to 1.5.0
     if (version_compare($current_version, '1.5.0', '<')) {
         /**
          * Add INDEX to word column in cache table
          */
         // check for index
         $wpdb->query("SHOW INDEX FROM  `" . $wpdb->prefix . "rp4wp_cache` WHERE KEY_NAME = 'word'");
         if (0 === intval($wpdb->num_rows)) {
             // add index
             $wpdb->query("ALTER TABLE `" . $wpdb->prefix . "rp4wp_cache` ADD INDEX(`word`);");
         }
         /**
          * Move excluded post meta ID's to option to improve related post query
          */
         // get all post ids that are excluded
         $excluded_ids = get_posts(array('fields' => 'ids', 'posts_per_page' => -1, 'meta_query' => array(array('key' => 'rp4wp_exclude', 'value' => '1'))));
         // check if there are any excluded posts
         if (count($excluded_ids) > 0) {
             // put excluded ids in comma separated string
             $excluded_ids = implode(',', $excluded_ids);
             // put in option
             update_option(RP4WP_Constants::OPTION_EXCLUDED, $excluded_ids);
         }
         /**
          * Delete CSS transient so the new frontend styling will apply after update
          */
         delete_transient(RP4WP_Constants::TRANSIENT_COMPONENT_CSS);
     }
     // Upgrade to 1.5.2
     if (version_compare($current_version, '1.5.2', '<')) {
         // fix the excludes
         $excludes = explode(',', get_option(RP4WP_Constants::OPTION_EXCLUDED, ''));
         if (count($excludes) > 0) {
             // trim values
             $excludes = array_map('trim', $excludes);
             // remove empty values
             $excludes = array_filter($excludes);
             // update option
             update_option(RP4WP_Constants::OPTION_EXCLUDED, implode(',', $excludes));
         }
     }
 }
 /**
  * Setup the settings
  *
  * @since  1.0.0
  * @access public
  */
 private function setup_settings()
 {
     // Setup settings default array
     $this->settings = array();
     // Add a general settings page for each installed post type
     $pt_manager = new RP4WP_Post_Type_Manager();
     $installed_post_types = $pt_manager->get_installed_post_types();
     if (count($installed_post_types)) {
         foreach ($installed_post_types as $installed_post_type => $pt_children) {
             $this->settings['general_' . $installed_post_type] = new RP4WP_Settings_General($installed_post_type);
         }
     }
     // Add other settings pages
     $this->settings['configurator'] = new RP4WP_Settings_Configurator();
     $this->settings['weights'] = new RP4WP_Settings_Weights();
     $this->settings['words'] = new RP4WP_Settings_Words();
     $this->settings['license'] = new RP4WP_Settings_License();
     $this->settings['misc'] = new RP4WP_Settings_Misc();
 }