web-dev-qa-db-fra.com

Comment puis-je passer get_the_author_meta ('user_email') à travers le REST API?

Dans mon plugin, si je code en dur une adresse e-mail dans ma fonction avec wp_mail() ou mail(), mon formulaire peut fonctionner:

function email_form($ip_address, $agent, $referrer, $email, $name, $message) {
    $to         = "[email protected]";
    $subject    = "Hard Coded";
    $email_body = 
        "IP ADDRESS: "  . $ip_address   . "\n" . 
        "USER AGENT: "  . $agent        . "\n\n" .
        "EMAIL: "       . $email        . "\n" .
        "NAME: "        . $name         . "\n" .
        "MESSAGE: "     . $message      . "\n";
    mail("$to", "$subject", "$email_body", "From: $email");
}

Cependant, lorsque j'essaie d'ajouter l'email basé sur l'auteur avec:

$to = get_the_author_meta('user_email');

à partir d'un global $post; il n'enverra pas l'email.

Si je crée une fonction au début du modèle et que je définis une variable, je peux obtenir que l'auteur se déclenche, mais je pense que cette approche est incorrecte. Je peux créer une page de paramètres, mais je veux que le destinataire en soit l'auteur. Dans un modèle de page qui envoie le traitement à un autre fichier PHP, quelle est la bonne façon de transmettre le courrier électronique de l'auteur indiquant le type de publication de la page ou toute autre donnée liée à WP (the_title(), thème, etc. etc.) via WP_REST_Request?


EDIT:

Après avoir découvert que je devrais y aller, wp_localize_script j'ai écrit:

function foobar() {
    if (is_page_template('page-foo.php')) {
        wp_enqueue_script( 'bar_js', site_url() . '/js/bar.js', array('jquery'), '1.0.0', true);
        $localized = array(
            'url_string'    => site_url(),
            'form_id'       => get_the_ID(),
            'author_email'  => get_the_author_meta('user_email', get_post_field('post_author', get_the_ID())),
        );
        wp_localize_script('bar_js', 'form_object', $localized);
    };
}
add_action('wp_enqueue_scripts', 'foobar');

et passé en bar.js:

jQuery(document).ready(function($) {
    console.log('file is being detected'); // FOR TESTING
    console.log(form_object.author_email);
});

mais existe-t-il un meilleur moyen d'appeler l'auteur par e-mail en dehors de la boucle de cette manière?

1

Pourquoi je n'ai pas accès aux informations de la poste?

Lorsque vous utilisez Admin-AJAX ou l'API REST, vous aurez uniquement accès aux données de l'utilisateur actuel (par cela, j'entends par défaut, tel que l'utilisation de is_user_logged_in()). Pour récupérer toute autre information, vous devez la passer sous forme d'argument dans votre demande AJAX. WordPress ne chargera pas tout dans une requête AJAX, vous devez donc trouver une solution de contournement.

Utilisation d'entrées cachées:

Étant donné que vous n'avez accès à aucune information liée à la publication (telle que l'ID de la publication), il serait préférable d'inclure une entrée masquée et d'y ajouter les données supplémentaires:

<input id="my-hidden-input" type="hidden" value="User ID Here" />

Cela va n'importe où dans votre fichier page.php. Maintenant, vous pouvez le récupérer en utilisant cette simple commande jQuery:

var userId = $('#my-hidden-input').val();

Localiser le script:

Il existe une meilleure alternative pour cela, et cela consiste à utiliser wp_localize_script() . Supposons que vous mettiez en file d'attente votre fichier JS principal comme suit:

wp_enqueue_script('my-js-handle','some/path/here.js');

Vous pouvez transmettre les données nécessaires à votre fichier JS en le localisant. Par exemple, nous devons transmettre l'ID de la poste. Nous pouvons le faire en créant un conditionnel et en localisant notre script:

if( is_page() ){
    $localization_array(
        'post_id' => get_the_ID(),
    );
    wp_localize_script( 'my-js-handle', 'my_object_name', $localization_array, )'
}

Maintenant, nous pouvons accéder à l'identifiant de l'article dans notre script aussi simple que cela:

window.alert( my_object_name.post_id );

Quelques notes:

  • Vous devriez avoir un fichier JS en file d'attente pour utiliser la deuxième méthode
  • Le nom du descripteur du script localisé doit être identique à celui du script mis en file d'attente.
  • Vous devez localiser votre script "avant" vous le mettez en file d'attente
1
Jack Johansson