web-dev-qa-db-fra.com

Quelle est une alternative à get_page_by_title ()?

Je code un thème pour lequel je souhaite afficher des informations dans le pied de page uniquement disponibles sur une page de modèle. J'utilise get_page_by_title(), qui fonctionne bien si vous savez comment la page s'appellera, mais à mon avis, ce n'est pas très dynamique, il est impossible de prédire comment un utilisateur nommera une page dans votre thème.

Dans mes recherches, j'ai trouvé une fonction appelée get_all_page_ids() qui renvoie un tableau d'identifiants indexés numériquement à partir du site. Cette fonction serait beaucoup plus cool s'il s'agissait d'un objet associatif (ou même d'un objet post), mais je m'éloigne du sujet.

J'ai envisagé d'utiliser quelque chose comme ceci:

$all_page_ids = get_all_page_ids();

foreach ($all_page_ids as $id) {
    // get_post() {@link https://developer.wordpress.org/reference/functions/get_post/}
    $post_object = get_post($id);

    // preg_match() {@link http://php.net/manual/en/function.preg-match.php}
    if(preg_match("/\b(contact)\b/i", $post_object->post_title)) {
        // do something here
    } else {
        // for readability
        continue;
    }
}

Cependant, cela crée toujours le problème de devoir savoir que l’utilisateur a choisi d’avoir le contact Word dans son titre. Que se passe-t-il s’ils créent une page appelée "Entrez en contact" qui est leur page de contact? Cela casserait.

En bref, ma question porte sur les meilleures pratiques pour les concepteurs de thèmes. get_page_by_title() est-il le moyen meilleur d'obtenir l'ID d'une autre page ou existe-t-il un moyen de combiner quelques fonctions/variables pour obtenir l'ID d'une autre page sans connaître le titre?

Ou y a-t-il des fonctions WordPress qui font ce genre de gros travaux ou est-ce que get_page_by_title() est le seul à proximité? Je soupçonne qu'il y a un bidouillage, mais une meilleure façon de le faire, je n'ai aucune idée. Merci pour toute aide que vous pouvez donner à ce sujet.

5
mrClean

Si vous ne forcez pas un titre et que vous ne le connaissez évidemment pas, la seule façon de le faire est de laisser l'utilisateur choisir la page à utiliser, généralement dans la page des options du thème, mais peut être fait dans le costumizer , ou même dans le cadre de l'édition de page

6
Mark Kaplun

Si votre page est un modèle de page, vous pouvez utiliser is_page_template($template_name)

Sinon, comme Mark l’a mentionné, vous devez créer une option de thème et laisser l’utilisateur choisir.

Plus: https://codex.wordpress.org/Function_Reference/is_page_template

UPDATE

J'ai mal interprété votre question. Vous pouvez obtenir toutes les pages en utilisant un certain nom de modèle, mais là encore, un utilisateur peut créer plusieurs pages de ce type avec le même modèle afin que vous ne sachiez pas laquelle choisir.

 $args = array(
    'meta_key'         => '_wp_page_template',
    'meta_value'       => 'page-about.php',
    'post_type'        => 'page'
 );
 $posts_array = get_posts( $args );

Une autre idée est de créer vous-même votre page avec du code lors de l'activation du thème/plug-in, puis de sauvegarder l'ID en tant qu'option mais aussi de fournir une option de thème à l'utilisateur pour modifier la page s'il le souhaite. C’est ainsi que WooCommerce fonctionne avec la page Boutique.

Encore une fois, je crois que l'approche de Mark est meilleure et plus sûre.

3
Laxmana