$ post im Init-Filter oder in der Aktion erhalten?


12

Es scheint, dass $ post nur für Hooks verfügbar ist, die zu bestimmten Zeiten ausgeführt werden. Ich habe einen "init" -Hook, der einige Daten mit der $ post-> ID aus der Datenbank abrufen muss.

Bisher bestand meine einzige Problemumgehung darin, einen weiteren Filter für den Inhalt hinzuzufügen, der $ post verwendet, um die benötigten Informationen abzurufen. Leider wird auch der Rückgabewert auf dem Bildschirm wiedergegeben und nicht an die Funktion zurückgegeben, die den Filter ursprünglich aufgerufen hat.

Hier ist der Code, der die von mir benötigten Daten extrahiert, den Wert jedoch wiedergibt und nicht zurückgibt:

add_filter('the_content', 'get_keyword');
function get_keyword()
{
    global $post;
    $keyword = get_post_meta( $post->ID, '_wpg_def_keyword', true );
    return $keyword;
}

Hat jemand einen Vorschlag, wie ich das bekommen kann, was ich brauche, und es zur späteren Verwendung im Plugin an die aufrufende Funktion zurückgeben lassen?

BEARBEITEN: Um dies möglicherweise klarer zu machen, wird bei init ein Filter ausgeführt, der in der Lage sein muss, Informationen zum aktuellen Beitrag aus der Datenbank abzurufen. Dazu ist Zugriff auf $ post-> ID erforderlich. In init ist dies jedoch nicht möglich. Wie kann ich das gewünschte Ergebnis erzielen?

Vielen Dank,

Jonathan

Gelöst:

Es stellte sich heraus, dass die Antwort einfach darin bestand, url_to_postid wie folgt zu verwenden:

$keyword = get_post_meta(
     url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ),
     '_wpg_def_keyword',
     true
);

Funktioniert auch von init perfekt.


1
Sie benötigen einen Aktionshaken und keinen Filterhaken. Es ist auch initzu früh global $post;, um im Geltungsbereich zu sein. Vielleicht hilft es besser, wenn Sie beschreiben, was Sie erreichen wollen.
Bainternet

Action Hook verhält sich genauso, ich habe beide ausprobiert. Ich weiß, dass init zu früh ist. Ich versuche herauszufinden, wie ich das gewünschte Ergebnis erzielen kann. Hierbei handelt es sich um einen Filter, der bei init ausgeführt wird und Informationen von der Datenbank empfängt, für deren Abruf $ post-ID erforderlich ist.
Jonathan

Haben Sie wirklich brauchen diese auf init zu tun? Warum nicht später haken?
Rarst

Ich muss das Standardschlüsselwort für die Seite abrufen, wenn in der URL noch keines angegeben ist. Dieses Schlüsselwort wird in der Datenbank gespeichert und muss bekannt sein, bevor der Rest des Skripts ausgeführt wird. Wie Sie in dem von mir bereitgestellten Beispiel sehen können, kann ich nur den Wert abrufen, den ich in the_content benötige, aber dann wird er auf dem Bildschirm wiedergegeben und geht überhaupt nicht an die aufrufende Funktion zurück. Wenn Sie eine andere Lösung haben, schlagen Sie diese bitte vor.
Jonathan

Bitte verschieben Sie Ihre Lösung in eine Antwort, die eher der Mechanik der Site entspricht. Auch keine Notwendigkeit, gelöst in Titel zu setzen - Sie könnten eine Antwort akzeptieren und Ihre Frage würde als beantwortet markiert.
Rarst

Antworten:


12

Es stellte sich heraus, dass die Antwort einfach url_to_postidso war:

$keyword = get_post_meta( url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ), '_wpg_def_keyword', true );

Funktioniert auch ab perfekt init.


2

Dies funktioniert auch in WordPress 4.7:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 

2

Hatte Probleme bei der Verwendung der akzeptierten Antwort, da diese nicht mit Ports und Multisite-Ports funktioniert . Hier ist eine Lösung, die in jedem Fall funktionieren sollte:

/**
* Note: This function will only work on SINGULAR posts/pages/post types
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// demo
add_action('init','my_super_early_meta_action');

function my_super_early_meta_action() {
    $keyword = get_post_meta( get_early_postid(), '_wpg_def_keyword', true );
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.