wake-up-neo.com

Seitenvorlagen vom Plugin funktionieren nach dem Upgrade nicht WP bis 4.7 oder höher

Ich arbeite an einem Plugin, das wir für die Bildungswebsite benötigen. Ich habe meinem Plugin 3-4 Seitenvorlagen hinzugefügt, damit wir aufrufen können, wenn das Plugin aktiviert ist.

Bis WordPress 4.7 funktionierte es einwandfrei; Aber als ich WordPress auf den neuesten Stand gebracht habe (von 4.6.3), werden Seitenvorlagen nicht einmal im Seitenattributbereich angezeigt.

Hier ist der Code, der mit älteren Versionen (vor 4.7) einwandfrei funktioniert hat:

add_action( 'wp_loaded', 'add_my_templates' );
function add_my_templates() {
    if( is_admin() ){
        global $wp_object_cache;
        $current_theme = wp_get_theme();
        $templates = $current_theme->get_page_templates();
        $hash = md5( $current_theme->theme_root . '/'. $current_theme->stylesheet );
        $templates = $wp_object_cache->get( 'page_templates-'. $hash, 'themes' );
        $templates['templates/exams.php'] = __('Exams');
        $templates['templates/colleges.php'] = __('Colleges');
        $templates['templates/study_home.php'] = __('Study Home');
        $templates['templates/study_job_home.php'] = __('Study Job Home');
        wp_cache_replace( 'page_templates-'. $hash, $templates, 'themes' );
    }
    else {
        add_filter( 'page_template', 'get_my_template', 1 );
    }
}

function get_my_template( $template ) {
    $post = get_post();
    $page_template = get_post_meta( $post->ID, '_wp_page_template', true );
    if( $page_template == 'templates/study_home.php' ) {
        $template = plugin_dir_path(__FILE__) . "templates/study_home.php";
    }
    if( $page_template == 'templates/study_job_home.php' ) {
        $template = plugin_dir_path(__FILE__) . "templates/study_job_home.php";
    }
    if( $page_template == 'templates/exams.php' ) {
        $template = plugin_dir_path(__FILE__) . "templates/exams.php";
    }
    if( $page_template == 'templates/colleges.php' ) {
        $template = plugin_dir_path(__FILE__) . "templates/colleges.php";
    }
    return $template;
}

Ich suche nach der Lösung der letzten 2 Tage, aber kein Glück!

4
Adi

Das Problem:

Wie Mark bereits vorgeschlagen , ist das Laden von Vorlagen durch Manipulieren des Caches weit von der Standardpraxis entfernt. Selbst wenn Sie Ihren CODE so ändern, dass er mit WordPress 4.7+ zusammenarbeitet, kann bei solchen Cache-Änderungen nicht garantiert werden, dass bei zukünftigen Updates ähnliche Probleme auftreten. Verwenden Sie daher besser eine der folgenden Lösungen:

Theme Lösung:

Anstatt Vorlagen aus einem Plug-In zuzuweisen, können Sie im aktiven Design aktuelle Seitenvorlagen haben. Ihr aktives Thema ist der empfohlene Ort für diese Seitenvorlagen.

Plugin-Lösung

Wenn Sie diese Vorlagen jedoch aus irgendeinem Grund Ihrem Plugin zuweisen müssen, verwenden Sie den theme_page_templates hook, um dies zu tun. Es wird für WordPress 4.4+ funktionieren.

Das Folgende ist das Umschreiben Ihres CODE mit theme_page_templates filter hook:

function get_my_template( $template ) {
    $post = get_post();
    $page_template = get_post_meta( $post->ID, '_wp_page_template', true );
    if( $page_template == 'templates/study_home.php' ){
        return plugin_dir_path(__FILE__) . "templates/study_home.php";
    }
    if( $page_template == 'templates/study_job_home.php' ){
        return plugin_dir_path(__FILE__) . "templates/study_job_home.php";
    }
    if( $page_template == 'templates/exams.php' ){
        return plugin_dir_path(__FILE__) . "templates/exams.php";
    }
    if( $page_template == 'templates/colleges.php' ){
        return plugin_dir_path(__FILE__) . "templates/colleges.php";
    }
    return $template;
}

function filter_admin_page_templates( $templates ) {
    $templates['templates/exams.php'] = __('Exams');
    $templates['templates/colleges.php'] = __('Colleges');
    $templates['templates/study_home.php'] = __('Study Home');
    $templates['templates/study_job_home.php'] = __('Study Job Home');
    return $templates;
}

function add_my_templates() {
    if( is_admin() ) {
        add_filter( 'theme_page_templates', 'filter_admin_page_templates' );
    }
    else {
        add_filter( 'page_template', 'get_my_template', 1 );
    }
}

add_action( 'wp_loaded', 'add_my_templates' );

Verwenden Sie den obigen CODE anstelle des von Ihnen angegebenen CODE. Es wird für jede WordPress-Version 4.4 und höher funktionieren. Ich habe es für WordPress 4.7.2 getestet und es funktioniert gut.

5
Fayaz

Ihr Caching-Einfügungscode sieht sehr seltsam aus und abhängig von einer bestimmten Art und Weise berechnet der Core Hashes für den Cache und verwendet sie. Sie müssen diesen Teil des Codes (von dem ich annehme, dass er virtuelle Seitenvorlagen hinzufügt) neu schreiben, um eine stabilere Einfügemethode zu finden, oder ihn einfach ganz aufgeben (warum nicht einfach tatsächliche Seitenvorlagen?)

Im Allgemeinen handelt es sich bei Seitenvorlagen um Themen, und Plug-ins sollten keine solchen enthalten. Stattdessen sollten sie Shortcodes oder andere Möglichkeiten bereitstellen, um dem Benutzer Seiten mit ihren Daten zur Verfügung zu stellen.

0
Mark Kaplun