web-dev-qa-db-fra.com

Obtenir l'URL personnalisée pour la taxonomie personnalisée

J'ai un type de message personnalisé appelé productpopups, et pour les trier, j'ai une taxonomie personnalisée appelée productcategory. Le type de publication a son propre modèle spécial (single-productpopup.php) et j'essaie de montrer chaque catégorie de produits avec un lien vers la catégorie. Le problème que j'ai est le suivant:

Le lien pour chaque catégorie de produit est dit example.com/productcategory/category mais la page vers laquelle je veux le lier est en fait example.com/category

Alors j'ai inventé ceci:

<p>Categories: 
<?php 
$categories = get_the_terms( $post->ID, 'productcategory' ); 
foreach( $categories as $category ) { 
    echo '<a href="http://example.com/'.$category->slug.'">'.$category->name.'</a>, '; 
}
?>
</p>

Cela fonctionne parce que les pages que j'ai configurées utilisent les mêmes slugs que la catégorie de produit, mais son hacky et un bordereau (comme une faute de frappe) le casseront.

Ce que j'aimerais absolument faire, c’est d’ajouter à la taxonomie un champ personnalisé dans lequel je peux spécifier l’URL de la page, puis pouvoir l’appeler à la place du http://example.com/.$category->slug

Est-ce possible?

Modifier pour plus de précisions: Oubliez le fait que c'est une URL, j'ai besoin d'un champ dans lequel je peux saisir des données, et qui peut être interrogé par produit, de sorte que si un produit a plusieurs catégories, les informations pour chaque être trouvé. Par exemple, le produit A a deux catégories, une et deux, un tableau comme celui-ci pourrait être formé:

+-----------+----------+--------------+
| Name      | Category | Custom Value |
+-----------+----------+--------------+
| Product A | C 001    | CV 001       |
+-----------+----------+--------------+
| Product A | C 002    | CV 002       |
+-----------+----------+--------------+
1
CalvT

Le code que j'ai finalement trouvé pour résoudre le problème!

<?php
global $wpdb;
$catresult = array();
$postid = get_the_ID();
$query1c = "SELECT wp_posts.ID, wp_terms.`name` AS `Category`, wp_pods_productcategory.`pc-url` AS `Url`
FROM wp_posts
INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
INNER JOIN wp_terms ON wp_term_relationships.term_taxonomy_id = wp_terms.term_id
LEFT OUTER JOIN wp_pods_productcategory ON wp_pods_productcategory.id = wp_term_relationships.term_taxonomy_id
INNER JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_id
WHERE wp_term_taxonomy.taxonomy = 'productcategory' AND wp_posts.ID =$postid
ORDER BY wp_terms.`name` ASC";
$categories = $wpdb->get_results( $query1c );
foreach ( $categories as $category )
{
array_Push( $catresult, "<a href='".$category->Url."'>".$category->Category."</a>" );
}
echo implode(', ', $catresult);
?>

Donc comment ça fonctionne?

<?php Ceci est la balise d'ouverture pour que le serveur sache ce qui va suivre est php.

global $wpdb Nous indiquons ici au serveur que nous allons nous connecter à la base de données WordPress.

$catresult = array(); Nous créons ici le tableau que nous utiliserons pour stocker les données.

$postid = get_the_ID(); Ici nous obtenons l'ID de publication pour pouvoir filtrer la requête.

$query1c = "SELECT.... Ici nous mettons la requête, qui sélectionne les champs que nous voulons, filtrés par wp_term_taxonomy.taxonomy = 'productcategory' et wp_posts.ID =$postid (c’est là que nous utilisons le $postid d’avant) et commandés par wp_terms.name ASC.

$categories = $wpdb->get_results( $query1c ) Ceci exécute la requête et enregistre les données brutes dans $categories.

Maintenant, nous devons convertir les données brutes en quelque chose que nous pouvons utiliser. Les données brutes sont actuellement enregistrées sous le nom $categories mais nous avons besoin de chaque résultat individuellement, nous avons donc:

foreach ( $categories as $category) Ici un résultat s'appelle $category

array_Push( $catresult, "<a href='".$category->Url."'>".$category->Category."</a>" ) Ici, nous "poussons" chaque résultat individuellement dans le tableau créé précédemment - $catresult. Chaque résultat a été préparé avec son lien (balise <a>).

Une dernière chose - comme nous voulons que ces catégories soient dans une liste, il serait mieux si elles sont séparées par des virgules! Alors:

echo implode(', ', $catresult) Donc ici nous "implosons" le tableau, ce qui signifie que nous mettons quelque chose entre chaque résultat du tableau, qui dans ce cas est une virgule suivie d'un espace. Ceci est ensuite imprimé sur la page à l'aide de la commande echo.

Enfin, ?> indique au serveur de fermer cette section php.

0
CalvT

Désolé de venir à la fête en retard. Voici ma solution

<?php
    //Retrieve the terms in productcategory taxonomy with posts (not empty)
    $terms = get_terms( array ( 'taxonomy' => 'productcategory', 'hide_empty' => false, 'parent' => 0, 'orderby' => 'description', 'order' => 'ASC' ));

    //loop through each term to get its attributes
    foreach ($terms as $term) {

        //Uncomment below code to see all the available attributes.
        //var_dump($term); 
        //die();
        $name        = $term->name;

        //PHP -> Store the link in variable to reuse
        //to get the link for the the particular term; you need to have the slug and pass it into the get_term_link() function.
        //the second argument is the taxonomy name in this case productcategory.
        $cat_link    = get_term_link( $term->slug, 'productcategory' );

?>

<a href="<?php echo $cat_link; ?>"><?php echo $name; ?></a>

<?php
    }

?>
1
omukiguy

Si vous avez créé la taxonomie vous-même, vous pouvez définir votre propre slug pour la taxonomie personnalisée. Par exemple:

register_taxonomy(
    'productcategory',
    array(
        'productpopups',
    ),
    array(
        'labels' => array(
            'name' => __('Categories', 'text-domain'),
        ),

        // --- set taxonomy slug ---
        'rewrite' => array(
            'slug' => '%productcategory%',  // set taxonomy slug
            'with_front' => false,          // set this to false
        )
        // -------------------------
    )
);

flush_rewrite_rules();  // <-- don't forget to add this line of code!
0
Victor