it-swarm.com.de

Laden von Skripten und Stilen über eine Meta-Box-Rückruffunktion

Fall:

Ich habe eine Reihe von Klassen, die Formularfelder auf der Grundlage von Daten aus einem Eingabearray erstellen. Die Klasse kann die folgenden Arten von Formularfeldern erstellen:

  • eingabe (einfach, versteckt, Passwort)
  • textbereich
  • radio
  • kontrollkästchen
  • wählen
  • farbwähler
  • datumsauswahl
  • datei-Upload

EDIT: Die Klasse verwendet wp_register_script/_style & wp_enqueue_script/_style, um die Skripte & Stile zu laden. Die Funktionen, die die Aktionen enthalten, sind wie folgt in die Klasse eingebunden: add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue' ) );.

Beispiel:

(Innerhalb functions.php)

// meta box callback function
function test_meta_box_cb()
{   
    $input_args = array(
         'type'         => 'color'
        ,'id'           => 'color-id'
        ,'label'        => 'Input Colorpicker Label'
        ,'opt_name'     => 'abc_xyz'
        ,'value'        => '009ee0'
     );
    new FormClass( $input_args, true );
}
// add the meta box
function add_test_meta_box()
{
    add_meta_box( 'test_box', __('TestBox'), 'test_meta_box_cb', 'post', 'advanced', 'high' );
}
add_action( 'add_meta_boxes', 'add_test_meta_box' );

Problem:

Auf diese Weise funktioniert mein Aufruf für wp_enqueue_script & wp_enqueue_style nicht. Ich bekomme die Formularfelder gerendert, aber keine Skripte oder Stile.

Situation & Rückverfolgung des Problems:

Bisher konnte ich das Problem auf die WordPress-Kernarchitektur zurückführen:

  • WP hinterfragt nicht, was in der Callback-Funktion passiert, bis do_action('add_meta_boxes', $post_type, $post) aufgerufen wird (in edit-form-advanced.php ).
  • Dieser Aufruf erfolgt lange nach dem Aufruf von admin-header.php (der do_action('admin_enqueue_scripts', $hook_suffix); enthält).
  • Daher kann das Script & Style nicht geladen werden (wenn ich mich nicht irre).

Frage:

  1. Wie kann ich Stile laden, bevor die Metabox-Formularfelder aufgerufen werden?
  2. Wie kann ich vermeiden, dass dasselbe Stylesheet immer wieder wiederholt wird - ich möchte wp_enqueue_style & wp_register_style verwenden?

Ich bin offen für alle Antworten, einschließlich derer, die mich zwingen, meine Klassenarchitektur umzuschreiben.

Hinweis: Ich muss diese Klasse in vielen verschiedenen Szenarien verwenden, daher ist es nicht gut, sie zusammen mit der Funktion add_meta_box zu bündeln. Ich bin kurz davor, eine Abstraktionsebene zu erstellen, die den Aufruf für die Meta-Box und den Stil-/Skript-Teil aufteilt, aber warum sollte ich über einer Kernfunktion eine weitere Ebene hinzufügen?

2
kaiser

Ihr Problem ist das Hinzufügen der Skripte, Stileinnerhalbder Klasse, und da die Klasseninstanz erstellt wird, wenn der Hook add_meta_box ausgelöst wird, sind zu diesem Zeitpunkt die wp_enqueue_script/style bereits fertig.

Eine Lösung für Sie ist das Hinzufügen der Skripte, Stileoutsideder Funktion und der Klasse. Und da Meta-Boxen nur zum Bearbeiten von Seiten verwendet werden, können Sie wie folgt vorgehen:

// the editing pages are actually post.php and post-new.php
add_action('admin_print_styles-post.php', 'custom_js_css');
add_action('admin_print_styles-post-new.php', 'custom_js_css');

function custom_js_css() {
    wp_enqueue_style('your-meta-box', $base_url . '/meta-box.css');
    wp_enqueue_script('your-meta-box', $base_url . '/meta-box.js', array('jquery'), null, true);
}

Eigentlich habe ich eine Meta-Box-Klasse für WP geschrieben, die einen anderen Ansatz verwendet. Anstatt wie Sie eine Formularklasse für Formularfelder zu schreiben, ist meine Klasse ein Wrapper für Meta-Boxen. Wenn Sie interessiert sind, lohnt es sich, einen Blick darauf zu werfen.

4
Anh Tran

Sie sollten Ihre Skripte wirklich an die Aktion wp_enqueue_scripts und Ihre Stile an die Aktion wp_print_styles binden. Überprüfen Sie in Ihren Funktionen, ob Sie mit Ihren Meta-Boxen auf der Seite sind, bevor Sie tatsächlich wp_enqueue_script() oder wp_enqueue_style() verwenden.

Zum Beispiel habe ich in einem meiner Plugins:

public static function enqueue_scripts_and_styles() {
    if( is_admin() ) {
        wp_enqueue_script( 'media-upload' );
        wp_enqueue_script( 'thickbox' );
        wp_enqueue_style( 'thickbox' );
    } else {
        wp_enqueue_style( 'wp-publication-archive-frontend', WP_PUB_Arch_INC_URL . '/front-end.css', '', '2.0', 'all' );
    }
}

Und ich hänge das an init an (das ausgelöst wird, kurz bevor alle anderen Skripte und Stile in die Warteschlange gestellt werden).

2
EAMann

In der aktuellen Form dummt Ihr Code das Objekt auf eine Art Funktionsaufruf (erstellt werden, etwas tun, sterben). Eine solche Verwendung ist nicht sinnvoll, wenn Sie möchten, dass das Objekt etwas ausführt, lange bevor es erstellt und zerstört wird.

Anstatt ein Objekt innerhalb des Metabox-Inhalts zu erstellen, würde ich Folgendes tun:

  1. Erstellen Sie das Objekt einige Zeit früher.
  2. Verwenden Sie die Methode des Objekts, um mit Skripten umzugehen.
  3. Verwenden Sie die Methode eines anderen Objekts als Meta-Box-Rückruf.
1
Rarst