web-dev-qa-db-fra.com

Appel à une fonction membre have_posts () sur un non-objet en boucle normale

<?php
defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
define( 'MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
define( 'MY_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
register_activation_hook(__FILE__,'my_plugin_install');
register_deactivation_hook( __FILE__, 'my_plugin_remove' );

function my_plugin_install() {
    global $wpdb;
    $the_page_title = 'TEST';
    $the_page_name = 'test';
    delete_option("my_plugin_page_title");
    add_option("my_plugin_page_title", $the_page_title, '', 'yes');
    delete_option("my_plugin_page_name");
    add_option("my_plugin_page_name", $the_page_name, '', 'yes');
    delete_option("my_plugin_page_id");
    add_option("my_plugin_page_id", '0', '', 'yes');
    $the_page = get_page_by_title( $the_page_title );

    if ( ! $the_page ) {
        $_p = array();
        $_p['post_title'] = $the_page_title;
        $_p['post_content'] = "";
        $_p['post_status'] = 'publish';
        $_p['post_type'] = 'page';
        $_p['comment_status'] = 'closed';
        $_p['ping_status'] = 'closed';
        $_p['post_category'] = array(1);
        $the_page_id = wp_insert_post( $_p );
    }
    else {
        $the_page_id = $the_page->ID;
        $the_page->post_status = 'publish';
        $the_page_id = wp_update_post( $the_page );
    }

    delete_option( 'my_plugin_page_id' );
    add_option( 'my_plugin_page_id', $the_page_id );
}

function my_plugin_remove() {
    global $wpdb;
    $the_page_title = get_option("my_plugin_page_title");
    $the_page_name = get_option("my_plugin_page_name");
    $the_page_id = get_option('my_plugin_page_id');
    if( $the_page_id ){wp_delete_post( $the_page_id );}
    delete_option("my_plugin_page_title");
    delete_option("my_plugin_page_name");
    delete_option("my_plugin_page_id");
}

function custom_template($template){
    $template = plugin_dir_path( __FILE__ ) . 'my-custom-page.php';
    return $template;
}

if ( !is_admin() ) {
    if ( have_posts() ) {
        while ( have_posts() ) {
            the_post();
            if(get_the_ID() == get_option('my_plugin_page_id')){
                add_filter( 'template_include', 'custom_template' );
            }
        }
    }
}
?>

C'est l'erreur donnée par le code:

Fatal error: Call to a member function have_posts() on a non-object in /var/www/html/wordpress/wp-includes/query.php on line 782

my-custom-page.php est une page de base contenant uniquement HTML et CSS.

La partie création de page est ok, à cause de la partie !is_admin(), il n'y a pas d'erreur pendant que je suis dans le panneau d'administration.

Avez-vous une idée du problème? Merci :)

P.S. L'installation de wordpress est la base 4.4.2 sans aucune modification (aucune nouvelle page, thème différent, etc.)

1
Zed93

Votre code est en cours d'exécution trop tôt avant l'évaluation de la requête "de base".

En règle générale, dans un plugin, connectez toujours votre code à un hook approprié, probablement wp_loaded est préférable s'il n'y a rien de plus spécifique

0
Mark Kaplun