web-dev-qa-db-fra.com

Ajout de section dynamique à WordPress

[Edit: j'ai ajouté un exemple plus concret ci-dessous]

J'ai besoin de convertir un site personnalisé PHP en WordPress. Le site contient plus de 60 000 éléments multimédias et une tonne de métadonnées, qui doivent tous être reportés sur le nouveau site. Les données multimédia sont accessibles via une API locale et j'ai déjà compris comment accéder à l'API dans WordPress, donc ce n'est pas un problème.

Ce que je ne comprends pas, c'est comment écrire un plugin pour que

  1. les paramètres d'URL déterminent ce qu'il faut montrer (idéalement via mod_rewrite); et
  2. comment et où exposer le plugin dans WordPress.

En d'autres termes, comment puis-je écrire un plugin pour que les URL /albums/12345 ou /authors/23456 soient résolues en pages ne contenant que le contenu correct?

Je serais vraiment heureux pour une simple RTFM, si vous pouvez me dire où chercher dans la documentation. Cela fait environ 10 ans que je n'ai rien fait avec WP, donc tout est assez nouveau pour moi maintenant. Je ne sais même pas où regarder.


Edit Voici un exemple plus concret:

Supposons que je souhaite mettre en place un flux de podcast constamment mis à jour à partir de RSS ou une liste de Tweets à partir de l'API Twitter ou quelque chose du genre. Fondamentalement, la source est accessible par une API bien définie (et je peux facilement gérer la logique pour charger, analyser et formater ce contenu); les données sont toutes là, prêtes à être lues.

Que dois-je faire pour que ce contenu s'affiche en réponse à des demandes d'URL spécifiques?

Par exemple, si quelqu'un accède à /podcasts/pages/1, comment puis-je faire en sorte que le contenu de la page affiche la première page des titres de podcast. Et s’ils accèdent à /podcasts/items/oct-31-2015-wordpress, comment puis-je afficher les métadonnées du podcast?

Est-ce que j'utilise une action ou un filtre? Quels crochets dois-je utiliser? Dois-je utiliser un type de message personnalisé à la place?

1
Andrew

Quelques approches pourraient fonctionner. Si vous recherchez des questions concernant les "pages virtuelles", vous trouverez peut-être des options qui pourraient vous convenir.

Un moyen rapide de mettre en œuvre cette-

1) Créez une page sous Pages dans l'administrateur WordPress. Ce sera la page chargée dans la requête principale et sera utilisée comme cible pour les règles de réécriture que vous ajouterez plus tard. Le contenu de la page n'a pas d'importance, vous n'avez pas besoin de le sortir si vous ne le souhaitez pas, c'est simplement pour que WordPress puisse exécuter avec succès une requête principale.

2) Ajoutez les vars de requête dont vous aurez besoin pour extraire les données des URL. Par exemple, album_id, podcast_id, etc., assurez-vous qu'ils sont suffisamment uniques pour ne pas entrer en conflit avec les propres vars de requête de WordPress. Il existe probablement une liste non exhaustive de ces vars sur la page de codex de taxonomie du registre . Exemple:

function wpd_my_query_vars( $qvars ) {
    $qvars[] = 'album_id';
    $qvars[] = 'podcast_id';
    return $qvars;
}
add_filter( 'query_vars', 'wpd_my_query_vars' , 10, 1 );

3) Ajoutez les règles de réécriture dont vous avez besoin pour les différentes demandes que vous souhaitez traiter. Vos règles cibleront la page créée à l'étape 1 et définiront les vars de requête que vous avez ajoutés à l'étape 2. Exemple:

function wpd_rewrite_rules(){
    add_rewrite_rule(
        '^albums/([^/]*)/?',
        'index.php?page_id=42&album_id=$matches[1]',
        'top'
    );
}
add_action( 'init', 'wpd_rewrite_rules', 10, 0 );

Notez que les règles de réécriture doivent être vidées chaque fois que de nouvelles règles sont ajoutées. Vous pouvez également le faire en visitant la page Paramètres> Liens permanents dans admin.

4) Cette dernière étape est facultative. Vous pouvez gérer tous ces types de demandes avec un seul modèle de page. Si vous souhaitez séparer les différentes demandes dans leurs propres modèles, ajoutez un filtre à page_template pour en charger un différent. Notez que WordPress considère toutes ces demandes comme la seule page que vous avez ciblée et est par ailleurs incapable de détecter par lui-même d'autres différences que vous avez créées avec vos propres règles et vars de requête. Exemple:

function wpd_page_template( $template = '' ) {
    global $wp_query;
    if( ! array_key_exists( 'album_id', $wp_query->query_vars ) ) return $template;

    $template = locate_template( 'album-template.php' );
    return $template;
}
add_filter( 'page_template', 'wpd_page_template' );

Vous pouvez le développer pour vérifier la présence des différents vars de requête que vous avez ajoutés afin de charger d'autres modèles. Vous pouvez accéder à vos vars de requête personnalisés directement à partir de $wp_query comme ci-dessus ou, si vous êtes moralement opposé aux globals, avec get_query_var . Vous pouvez également cibler ce filtre sur une seule page ou un tableau de pages via la balise conditionnelle is_page .

Il peut y avoir quelques autres éléments que vous souhaitez nettoyer dans cette approche. Par exemple, vous souhaiterez peut-être supprimer rel_canonical de l'action wp_head sur ces pages et ajouter votre propre fonction pour générer des balises méta canoniques pour ce contenu.

2
Milo