obtenir $ post dans le filtre ou l'action init?


12

Il semble que $ post ne soit disponible que pour les hooks exécutés à certains moments. J'ai un hook "init" qui doit extraire certaines données de la base de données en utilisant l'ID $ post->.

Jusqu'à présent, ma seule solution de contournement a été d'ajouter un autre filtre sur le_contenu, qui utilise $ post pour obtenir les informations dont j'ai besoin. Malheureusement, il renvoie également la valeur de retour à l'écran et ne parvient pas à la renvoyer à la fonction qui a appelé le filtre à l'origine.

Voici le code qui extrait les données dont j'ai besoin, mais qui fait écho et ne renvoie pas la valeur:

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

Quelqu'un at-il une suggestion sur la façon d'obtenir ce dont j'ai besoin et de le faire revenir à la fonction d'appel pour une utilisation ultérieure dans le plugin?

EDIT: Pour éventuellement rendre cela plus clair, j'ai un filtre en cours d'exécution à init, qui doit être en mesure de récupérer des informations sur le message actuel de la base de données. Pour ce faire, il nécessite l'accès à $ post-> ID. Mais ce n'est pas possible dans init, alors comment puis-je obtenir le résultat dont j'ai besoin?

Merci,

Jonathan

RESOLU:

Il s'avère que la réponse était simplement d'utiliser url_to_postid comme ceci:

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

Fonctionne parfaitement même depuis l'init.


1
vous avez besoin d'un crochet d'action et non d'un crochet de filtre, il initest également trop tôt pour global $post;être dans le champ d'application. peut-être que si vous décrivez ce que vous essayez d'accomplir vous aidera mieux.
Bainternet

action hook se comporte exactement de la même manière, j'ai essayé les deux. Je sais qu'init est trop tôt, j'essaie de comprendre comment obtenir le résultat dont j'ai besoin - qui est un filtre exécuté à init recevant des informations de la base de données qui nécessite $ post-ID pour être récupéré.
Jonathan

Avez-vous vraiment besoin de le faire sur init? Pourquoi ne pas accrocher plus tard?
Rarst

Je dois récupérer le mot clé par défaut de la page, si aucun n'a déjà été fourni dans l'URL. Ce mot-clé est stocké dans la base de données et doit être connu avant l'exécution du reste du script. Comme vous pouvez le voir dans l'exemple que j'ai fourni, je ne peux obtenir que la valeur dont j'ai besoin dans le_contenu, mais il résonne à l'écran et ne revient pas du tout à la fonction appelante. Si vous avez une autre solution, veuillez la suggérer.
Jonathan

Veuillez déplacer votre solution vers une réponse, qui serait plus conforme à la mécanique du site. Pas besoin non plus de mettre résolu dans le titre - vous seriez en mesure d'accepter la réponse et votre question serait marquée comme ayant reçu une réponse.
2011 à 9h26

Réponses:


12

Il s'avère que la réponse était simplement d'utiliser url_to_postidcomme ceci:

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

Fonctionne parfaitement même à partir de init.


2

Cela fonctionne également dans WordPress 4.7:

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

2

A rencontré des problèmes lors de l'utilisation de la réponse acceptée car elle ne fonctionne pas avec les ports et les ports multisites . Voici une solution qui devrait fonctionner dans tous les cas:

/**
* 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 );
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.