it-swarm.com.de

Benutzerdefinierte URL für benutzerdefinierte Taxonomie abrufen

Ich habe einen benutzerdefinierten Beitragstyp namens productpopups und zum Sortieren eine benutzerdefinierte Taxonomie namens productcategory. Der Beitragstyp hat eine eigene spezielle Vorlage (single-productpopup.php) und ich versuche, jede Produktkategorie mit einem Link zur Kategorie anzuzeigen. Das Problem, das ich habe, ist das folgende:

Der Link für jede Produktkategorie lautet "example.com/productcategory/category", aber die Seite, auf die ich ihn verlinken möchte, ist tatsächlich "example.com/category".

Also habe ich folgendes erfunden:

<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>

Dies funktioniert, weil die von mir eingerichteten Seiten dieselben Slugs verwenden wie die Produktkategorie, aber sie werden durch Hacky und einen Slip (wie ein Tippfehler) beschädigt.

Was ich unbedingt tun möchte, ist, der Taxonomie ein benutzerdefiniertes Feld hinzuzufügen, in dem ich die Seiten-URL angeben und diese dann anstelle des http://example.com/.$category->slug aufrufen kann.

Ist das möglich?

Zur weiteren Verdeutlichung bearbeiten: Vergiss die Tatsache, dass es sich um eine URL handelt. Ich benötige ein Feld, in das ich Daten eingeben und nach Produkten abfragen kann. Wenn ein Produkt mehrere Kategorien hat, können die Informationen für jede Kategorie angegeben werden gefunden werden. Angenommen, Produkt A hat zwei Kategorien, eine und zwei. Eine Tabelle wie diese könnte gebildet werden:

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

Den Code, den ich mir endlich ausgedacht habe, um das Problem zu beheben!

<?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);
?>

Wie funktioniert das?

<?php Dies ist das öffnende Tag, damit der Server weiß, was als nächstes kommt, und zwar php.

global $wpdb Hier teilen wir dem Server mit, dass wir eine Verbindung zur WordPress-Datenbank herstellen.

$catresult = array(); Hier erstellen wir das Array, in dem die Daten gespeichert werden.

$postid = get_the_ID(); Hier erhalten wir die Beitrags-ID, um die Abfrage filtern zu können.

$query1c = "SELECT.... Hier setzen wir die Abfrage ein, die die gewünschten Felder auswählt, nach wp_term_taxonomy.taxonomy = 'productcategory' und wp_posts.ID =$postid gefiltert (hier verwenden wir den $postid von vorher) und nach wp_terms.name ASC sortiert.

$categories = $wpdb->get_results( $query1c ) Dies führt die Abfrage aus und speichert die Rohdaten in $categories.

Jetzt müssen wir die Rohdaten in etwas konvertieren, das wir verwenden können. Die Rohdaten werden derzeit als $categories gespeichert, aber wir brauchen jedes Ergebnis einzeln, also setzen wir:

foreach ( $categories as $category) Hier wird ein Ergebnis als $category bekannt

array_Push( $catresult, "<a href='".$category->Url."'>".$category->Category."</a>" ) Hier 'pushen' wir jedes Ergebnis einzeln zu dem Array, das wir zuvor erstellt haben - $catresult. Jedes Ergebnis wurde mit seinem Link (<a> tag) vorbereitet.

Eine letzte Sache - da wir diese Kategorien in einer Liste haben wollen, wäre es besser, wenn sie durch Kommas getrennt wären! So:

echo implode(', ', $catresult) Hier implodieren wir also das Array, was bedeutet, dass wir zwischen die einzelnen Ergebnisse des Arrays etwas einfügen, in diesem Fall ein Komma, gefolgt von einem Leerzeichen. Dies wird dann mit dem Befehl echo auf die Seite gedruckt.

Schließlich weist ?> den Server an, diesen Abschnitt php zu schließen.

0
CalvT

Tut mir leid, dass ich zu spät zur Party komme. Hier ist meine Lösung

<?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

Wenn Sie die Taxonomie selbst erstellt haben, können Sie einen eigenen Slug für die benutzerdefinierte Taxonomie festlegen. Zum Beispiel:

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