2

I'm getting the following error Fatal error: Call to a member function get_page_permastruct() /link-template.php on line 276 when I invoke the in class constructor the wp_insert_post($new_post);.

add_action( 'plugins_loaded', array ( 'test', 'init' ) );
class test{

    public static function init()
    {
        new self;
    }

    //the consructor for parser admin
    function __construct(){

        global $wpdb;
        $this->db = $wpdb;      

        if ($_POST['action'] == 'add-page'){
            add_action( 'plugins_loaded', array ( $this, 'add_newpage' ) );
            $this->add_newpage();
        }
    public function add_newpage(){
        $new_post = array(
                'post_title' => $_POST['page-name'],
                'post_content' => '',
                'post_status' => 'publish',
                'post_type' => 'page'
        );

        $post_id = wp_insert_post($new_post);   
        $newtarget = $this->db->insert( 
                    'wp_test_table', 
                    array( 
                        'post_id' => $post_id, 
                        'slug' => 'test'
                    ), 
                    array( 
                        '%d', 
                        '%s' 
                        ) 
                    );

    }

}
6

This happens because plugins_loaded fires before the global variable $wp_rewrite exists.

From wp-settings.php:

// Load active plugins.
foreach ( wp_get_active_and_valid_plugins() as $plugin )
    include_once( $plugin );
unset( $plugin );

// Load pluggable functions.
require( ABSPATH . WPINC . '/pluggable.php' );
require( ABSPATH . WPINC . '/pluggable-deprecated.php' );

// Set internal encoding.
wp_set_internal_encoding();

// Run wp_cache_postload() if object cache is enabled and the function exists.
if ( WP_CACHE && function_exists( 'wp_cache_postload' ) )
    wp_cache_postload();

do_action( 'plugins_loaded' );

// Define constants which affect functionality if not already defined.
wp_functionality_constants( );

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();

do_action( 'sanitize_comment_cookies' );

/**
 * WordPress Query object
 * @global object $wp_the_query
 * @since 2.0.0
 */
$wp_the_query = new WP_Query();

/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global object $wp_query
 * @since 1.5.0
 */
$wp_query =& $wp_the_query;

/**
 * Holds the WordPress Rewrite object for creating pretty URLs
 * @global object $wp_rewrite
 * @since 1.5.0
 */
$GLOBALS['wp_rewrite'] = new WP_Rewrite();

Solution: Hook into wp_loaded, not plugins_loaded.

  • but what if i want to call in plugins_loaded or in earlier actions? – T.Todua May 18 '16 at 18:37
  • @tazotodua Then stop wanting that. Rethink your approach. – fuxia May 18 '16 at 19:13

protected by Community May 8 '18 at 15:11

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.