apply_filters ('the_content', $ content) vs do_shortcode ($ content)

21

Nehmen wir an, ich habe eine Designoption oder einen benutzerdefinierten Postmeta-Textbereich. Jetzt möchte ich mehrere Shortcodes, allgemeine Texte, Bilder usw. ausführen.

Was ist die beste Vorgehensweise und warum?

Option 1:

$content = //my text area data;
echo apply_filters('the_content', $content);

Option 2:

$content = //my text area data;
echo do_shortcode($content);

Erklären Sie mir bitte, welches die beste Vorgehensweise ist und warum.

BEARBEITEN

Lassen Sie mich das Szenario im Detail beschreiben. Ich entwickle Themen für Kunden mit ihren Anforderungen. Manchmal muss ich Post-Meta zu Post / Seiten / benutzerdefinierten Post-Typen hinzufügen, damit sie Shortcodes (Schieberegler, Kontaktformular usw.) oder nur einen einfachen Text hinzufügen können. Es ist ein Text abgelegt.

Damit der Shortcode funktioniert, verwende ich Option 1 . Nun hörte ich von jemandem, dass dies ein falscher Weg ist, und ich sollte es benutzen do_shortcode. Aber sie haben mir nicht erklärt, warum es falsch ist. Deshalb frage ich.

Dieser ganze Vorgang kann im Standard-Texteditor von wp durchgeführt werden. Aber ich muss diese Optionen für die vorlagenspezifische Verwendung erstellen, das ist es, was meine Kunden wollen.

von Sufi
quelle

Antworten:

16

FRAGE UND ANTWORT ÜBERARBEITET

Es gibt manchmal diese Fragen, die dich nörgeln und dich später im Leben wieder jagen, und dies ist eine solche Frage.

Diese Frage ließ mich über eine alternative Lösung des Problems nachdenken. Wie bereits erwähnt, dienen benutzerdefinierte Felder und Meta-Boxen dazu, kleine Teile von Metadaten zu speichern, und dienen nicht als Erweiterung zum Posten von Inhalten, in denen Sie Shortcode und Funktionen ausführen können. Wie ich bereits sagte, ist Ihre Methode auch falsch und sollte nicht verwendet werden

Was ich in Ihrem Beitrag als interessant empfunden habe, ist, dass Sie benutzerdefinierte Felder und Metafelder verwendet haben, um versehentlich benutzerdefinierten Inhalt von Benutzereingaben anzuzeigen. Also habe ich gesessen und über eine Möglichkeit nachgedacht, diese Arbeit zu machen und die benutzerdefinierten Felddaten und Meta-Box-Daten korrekt zu verwenden

Das ist meine Idee:

DAS SZENARIO:

HINWEIS: Dies kann nach Bedarf geändert werden

In einem einzelnen Beitrag möchte / muss ein Benutzer benutzerdefinierten Inhalt dynamisch nach dem Beitrag anzeigen, um ihn an seine Bedürfnisse anzupassen. Dies sollte dynamisch sein. Der Inhalt sollte eine benutzerdefinierte Abfrage sein, und der Benutzer muss auswählen, was angezeigt werden soll, wann und was er möchte

DIE MÖGLICHE LÖSUNG:

Shortcodes funktionieren hier nicht, da Shortcodes nicht in benutzerdefinierten Feldern ausgeführt werden können. Beides wird nicht do_shortcodefunktionieren, da es nicht dynamisch und fest codiert ist, was wir nicht wollen. Wie in Ihrer Frage werden wir benutzerdefinierte Felder verwenden. Ich betone noch einmal, verwende das benutzerdefinierte Feld nicht, um eine benutzerdefinierte Abfrage oder Shortcodes auszuführen

DER PLAN:

Wir werden das benutzerdefinierte Feld verwenden, um nur unsere Abfrageargumente zu speichern, das ist alles. Wir erstellen also ein benutzerdefiniertes Feld mit dem Namen custom_query_arguments. In Ihrem Post-Editor-Bildschirm sehen Sie jetzt Ihr benutzerdefiniertes Feld, das zur Verwendung bereit ist

Der nächste Schritt besteht darin, unsere benutzerdefinierten Abfrageargumente zu unserem Feld hinzuzufügen. Nehmen wir an, wir müssen 3 Beiträge der Kategorie 1 nach Titel sortiert anzeigen. Unsere Abfrageargumente sollten also so aussehen: ( Im String-Format )

'posts_per_page=3&cat=1&orderby=title'

Dies ist, was Sie jetzt in Ihr benutzerdefiniertes Feld eingeben sollten. Speichern Sie nach der Eingabe den Wert Ihres benutzerdefinierten Felds

Als nächstes wird die benutzerdefinierte Abfrage in Ihrer single.php erstellt. Was hier benötigt wird, müssen wir den Wert aus unserem benutzerdefinierten Feld WP_Queryabrufen , bei dem es sich eigentlich um unsere Abfrageargumente handelt, und diesen an eine neue Instanz von weiterleiten, um die Posts abzurufen. Wir müssen auch prüfen, ob in diesem benutzerdefinierten Feld tatsächlich ein Wert gespeichert ist oder nicht. Wenn das benutzerdefinierte Feld leer ist, wird nichts angezeigt

DER CODE:

Du kannst so etwas in single.php gleich nach dem einzelnen Beitrag ausprobieren.

$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// check if the custom field has a value
if( ! empty( $args ) ) {

    $q = new WP_Query( $args );

    if( $q->have_posts() ) {
        while( $q->have_posts() ) {
            $q->the_post();

            the_title();

        }
        wp_reset_postdata();
    }

} 

Wenn der Benutzer die benutzerdefinierte Abfrage entfernen möchte, kann er einfach den Wert des benutzerdefinierten Felds löschen und das benutzerdefinierte Feld leer lassen. Wenn er dieselbe Abfrage aus Kategorie 10 und insgesamt 5 Posts anzeigen muss, kann er den ursprünglichen Wert einfach durch den folgenden ersetzen

'posts_per_page=5&cat=10&orderby=title'

EINIGE ANMERKUNGEN:

Es ist wichtig, dass Sie die richtige Synchronisation und das richtige Format verwenden, wenn Sie Informationen in diese benutzerdefinierten Felder und Metafelder eingeben. Syntaxfehler oder falsche Informationen führen zu unerwünschten Ausgaben oder sogar zu schwerwiegenden Fehlern. Es ist wichtig, dass Sie Ihre Kunden über solche Informationen informieren

URSPRÜNGLICHE ANTWORT

Ich verstehe nicht, was Sie erreichen wollen, aber nach allem, was ich Ihnen sagen kann, sind das zwei verschiedene Dinge

OPTION 1

apply_filters('the_content', $content);wird verwendet, um die Inhaltsfilter auf ungefilterten Post-Rohinhalt anzuwenden, der normalerweise aus der Verwendung von stammt $post->post_content. Zu diesen Filtern gehört der berühmte Filter, wp_autopder p-Tags hinzufügtthe_content()

apply_filters('the_content', $content); wird üblicherweise in Verbindung mit dem verwendet, get_postswo direkt mit den WP_PostObjekten gearbeitet wird, ohne setup_postdata( $post )dass die Template-Tags wie the_content() zur Verwendung verfügbar gemacht werden

OPTION 2

do_shortcode wird verwendet, um einen Shortcode an einer beliebigen Stelle in Vorlagendateien außerhalb des Texteditors im Bildschirm-Backend des Seiteneditors einzufügen und Shortcodes grundsätzlich durch ihre Hooks zu filtern.

Die korrekte Verwendung ist wie folgt

Beispiel: Hinzufügen des Galerie-Shortcodes zu einer Vorlagendatei

echo do_shortcode( '[gallery]' )

EDIT 1

Nach Ihren Kommentaren würde ich dann überhaupt keinen Shortcode verwenden.

Wenn Sie keinen Shortcode über den Texteditor hinzufügen und ihn direkt (Hardcode) über do_shortcodein eine Vorlagendatei einfügen möchten, würde ich die Funktion eher einfach der Vorlage hinzufügen

Beispiel:

Wenn Sie die folgende Shortcode-Funktion haben

function footag_func( $atts ) {
    return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );

Sie können die Funktion einfach direkt in einer Vorlage wie aufrufen

echo footag_func();

Auf diese Weise ist es viel schneller, da der Shortcode nicht analysiert werden muss

BEARBEITEN 2

Um ehrlich zu sein, machen Sie das bei Ihrer Bearbeitung völlig falsch. Deshalb konnte ich Ihre Ausgangsfrage nicht verstehen

Manchmal muss ich Post-Meta zu Post / Seiten / benutzerdefinierten Post-Typen hinzufügen, damit sie Shortcodes (Schieberegler, Kontaktformular usw.) oder nur einen einfachen Text hinzufügen können. Es ist ein Text abgelegt.

Damit der Shortcode funktioniert, verwende ich Option 1 .....

Benutzerdefinierte Felder sind keine Textfelder und dürfen mit Sicherheit nicht zum Ausführen von Shortcodes und für diesen Zweck von Schiebereglern oder Kontaktformularen verwendet werden. Benutzerdefinierte Felder sollten niemals verwendet werden, um den Texteditor in Posts und Seiten zu ersetzen.

Wie ich bereits sagte, apply_filters('the_content', $content);soll verwendet werden, um Formatierungen auf rohen Post-Inhalt anzuwenden.

Sie haben hier zwei Möglichkeiten

  • Verwenden Sie do_shortcodedirekt in Template - Dateien, die ich würde nicht so mit der Funktion empfehlen ist schneller als Shortcode muss nicht analysiert werden

  • Verwenden Sie den Shortcode direkt im Texteditor für die jeweilige Seite / den jeweiligen Beitrag

Ich würde ernsthaft empfehlen, dass Sie Ihre Strukturen und das, was Sie erreichen möchten, neu betrachten. Benutzerdefinierte Felder sind keine Texteditoren und können keine Shortcodes oder Schieberegler ausführen.

Meine Empfehlung wäre, vielleicht in benutzerdefinierte Widgets oder ein System zu schauen, das Sie mit benutzerdefinierten Feldern verwenden können

Pieter Goosen
quelle
1
Pieter danke für die Erklärung. Ich weiß schon, dass. Aber ich habe gefragt, welche Option genauer ist, wenn das Ziel nur die Ausgabe von Shortcodes aus dem Textbereich für Post-Meta- / Design-Optionen ist. Ich verwende Option1, um den gefilterten Inhalt zu erhalten, und es wurde eine Gewohnheit von mir. Und mit Option 1 können Sie auch nur einen Shortcode aus einer Textdatei drucken. Also wurde gefragt.
Von Sufi
Ich habe den Schnitt gesehen. Ich habe dich verstanden. Aber mein Szenario ist anders. Es ist so, als gäbe es eine Textdatei / einen Bereich und mehrere Shortcodes. Jetzt kann der Benutzer einen beliebigen Shortcode in diesem Bereich eingeben. So kann ich eine Funktion nicht direkt nutzen. Ich muss diesen Teil dynamisch halten.
Von Sufi
Wo ist das Textfeld, ist es das gleiche wie im Back-End-Seiteneditor-Bildschirm
Pieter Goosen
Es kann ein Post-Meta sein. Oder es kann eine Themenoption sein. Ich benutze den Inhaltsfilter für beide.
Von Sufi
Sorry, aber dann macht das alles keinen Sinn. Warum möchten Sie Kurzwahlen in benutzerdefinierten Feldern verwenden? Warum solltest du dann überhaupt Shortcodes benutzen?
Pieter Goosen