web-dev-qa-db-fra.com

Création de relations entre plusieurs types de contenu

Je travaille sur un site comportant plusieurs types de contenu en plus des types intégrés (voir la liste ci-dessous). J'aimerais établir la capacité de marquer un contenu lié dans n'importe quel sens, d'un type de contenu à un autre.

Les types de contenu sont:

  • post
  • page
  • topic (de bbpress)
  • case (types personnalisés à partir de maintenant)
  • note
  • question
  • therapy_guideline

Ci-dessous, j'ai le code de mon functions.php utilisé pour configurer les connexions possibles des publications aux autres types de contenu:

p2p_register_connection_type(
    array(
        'name' => 'post-to-post',
        'from' => 'post',
        'to' => 'post'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-page',
        'from' => 'post',
        'to' => 'page'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-topic',
        'from' => 'post',
        'to' => 'topic'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-case',
        'from' => 'post',
        'to' => 'case'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-note',
        'from' => 'post',
        'to' => 'note'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-question',
        'from' => 'post',
        'to' => 'question'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-therapy_guideline',
        'from' => 'post',
        'to' => 'therapy_guideline'
    )
);

C'est juste pour établir des relations à partir de publications vers d'autres types de contenu. J'ai répété ces incantations pour établir les autres connexions - 28 au total. Je recule devant la répétition. Cela pourrait devenir très délicat si davantage de types de contenu étaient ajoutés et s'ils devaient pouvoir se connecter à tous (ou à la plupart) des autres types.

Je me suis dit que je pourrais utiliser une boucle pour parcourir chacun de ces types de contenu et générer une connexion entre eux, mais cela ne me convient pas. J'ai également entendu parler de la valeur réciproque , mais cela semble provenir d'un type de contenu renvoyant au même type. Existe-t-il un moyen de simplifier la création de liens entre des types de contenu distincts sans avoir à le faire pour chaque direction (de et vers)?

Mon intention est de faciliter la sélection du contenu associé par rapport au contenu actuel, via le backend lors de la création/édition de contenu. Ensuite, pour afficher une section "Contenu associé" après l'affichage du contenu actuel. Ces éléments de contenu liés pourraient concerner l’ensemble des types de contenu utilisés, mais seraient sélectionnés manuellement pour assurer une pertinence maximale.

J'utilise des taxonomies personnalisées à travers ces types de contenu et j'ai envisagé de l'utiliser pour trouver du contenu connexe, mais les taxonomies seraient toujours trop larges. La sélection manuelle semble être la voie à suivre.

4
Grant Palin

Pourquoi ne pas faire ...

$my_post_types = array(
    'post', 
    'page', 
    'topic', 
    'case', 
    'note', 
    'question', 
    'therapy_guideline'
);

p2p_register_connection_type( array(
    'name' => 'my_post_relationships',
    'from' => $my_post_types,
    'to' => $my_post_types,
    'sortable' => 'any',
    'reciprocal' => false,
    'cardinality' => 'many-to-many',
    'title' => array(
        'from' => 'Children',
        'to' => 'Parent',
        ),
    'admin_column' => 'any',
    )
);

Ou quelque chose de similaire?

Modifier:

Une façon d'obtenir éventuellement vos multiples boîtes sans tout cela en tapant, en utilisant le tableau susmentionné.

foreach($my_post_types as $post_type){
    // use line below if you don't ever need to relate posts to posts, pages to pages, etc.
    $temp_array = array_diff($my_post_types, array($post_type));

    p2p_register_connection_type( array(
        'name' => 'my_'.$post_type.'_connections',
        'from' => $temp_array, // use $my_post_types if you didn't define $temp_array
        'to' => $post_type,
        'sortable' => 'any',
        'reciprocal' => false,
        'cardinality' => 'many-to-many',
        'admin_column' => 'any',
        )
    )
}

Le tableau temporaire fait en sorte que chaque type de publication soit lié à tous les autres types de publication, mais pas lui-même. Je ne sais pas si c'est quelque chose que vous voulez ou non, c'est assez facile à enlever.

6
GhostToast

GhostToast semble avoir répondu à votre problème avec la répétition.

Cette mise en œuvre dans votre situation spécifique devrait afficher le contenu associé: https://github.com/scribu/wp-posts-to-posts/wiki/Related-posts :

$ related = p2p_type ('posts_to_pages') -> get_related (get_queried_object ());

La seule différence est que nous avons remplacé get_connected () par get_related ().

Pour trouver manuellement un contenu spécifique, cela m’a été utile dans le passé: http://wordpress.org/plugins/better-bien-internal-link-search/

3
128KB

La meilleure façon de le faire consiste à enregistrer une taxonomie non hiérarchique, partagée entre les différents types de publication que vous souhaitez associer.

Vous pouvez ensuite utiliser l'interrogation de la taxonomie intégrée de WP pour extraire tout le contenu associé pour n'importe quel terme. En règle générale, tout ce que vous allez interroger devrait être une taxonomie plutôt qu'un champ, car l'interrogation par champs est beaucoup plus lourde pour la base de données.

1
Chris Cox

La question que je me pose est la suivante: pour quoi et comment utilisez-vous les informations sur les relations? Où est-il affiché ou en avez-vous besoin pour toute autre logique métier?

Autant que je sache, il n’existe aucun moyen d’utiliser les fonctions de base pour cela.

Si je souhaitais réaliser quelque chose comme cela sans plugin auparavant, j’écrivais une PHP personnalisée qui ajoute automatiquement une taxonomie pour la sauvegarde des informations relationnelles entre les types de publication. Le principal avantage de l'utilisation d'une taxonomie supplémentaire par rapport à l'utilisation de post_meta est que vous pouvez plus facilement interroger et accéder à votre contenu en fonction des informations de relation.

Si la surcharge d'un plugin était ok pour la fonctionnalité désirée, j'ai utilisé Advanced Custom Fields (types de champs objet relationnel ou post), qui fait tout cela sans php avec juste quelques clics dans le backend (mais utilise post_meta pour sauver les relations).

1
s1lv3r

Si vous souhaitez créer une relation entre les types de publication personnalisés, vous pouvez utiliser le plug-in TYPES . En utilisant ce plugin, vous pouvez créer un type de post personnalisé et également définir une relation entre eux comme une relation parent ou enfant.

Vous pouvez également enregistrer la valeur de relation dans la table post_meta afin de pouvoir plus facilement interroger et accéder à votre contenu en fonction des informations de relation.

0
ksr89

Vous avez besoin de cela ou plus complexe?

enter image description here

C'est juste un exemple de prototype. therapy_guideline pourrait avoir surgical_therapy_guideline, conservative_therapy_guideline, palliative_therapy_guideline, etc.

Aussi complexe que vous voulez, vous pouvez le faire. Vous devez en fait implémenter le Web sémantique sur ce site. Le moyen le plus simple de créer une sémantique consiste à utiliser des données RDFa. Vous pouvez utiliser Enhanced Publication Plugin . Il existe de nombreuses ressources gratuites pour la création de Web sémantique . Vous pouvez utiliser Apache Stanbol plus Open Fine (recherche dans Google Project). Ce que vous allez utiliser dépend de la masse de requêtes possibles et de l’évolutivité de la base de données, ainsi que de vos connaissances. Enhanced Publication Plugin ajoutera progressivement de petites données à la base de données MySQL de WordPress (ce n'est même pas MySQLi). Il est préférable de convertir au format PostgreSQL sur le serveur nginx si vous souhaitez utiliser WordPress plus Plugin et que la charge sur le serveur est très élevée.

Évidemment, vous pouvez utiliser RDFa, JSON ou API avec Apache Stanbol et l’utiliser avec PHP ou avec le crochet personnalisé WordPress. Vous pouvez utiliser la structure de Yet Another Related Post Plugin si vous souhaitez créer un plugin.

0