Links in mehreren Kategorien erhalten (Schnittpunkt)

Ich verwende get_bookmarks() , um Lesezeichenlinks zu erhalten. Ich kann Links bekommen, die in Katze A oder Katze B gepostet werden, aber ich will nur Verbindungen in A und B.

Beispiel was ich brauche:

Ich habe drei Linkkategorien cat#1 , cat#2 , cat#3 .

Ich brauche Links in cat#1 AND cat#2 nicht cat#1 OR cat#2 (Kreuzung).

Ich verwende derzeit:

 $links = get_bookmarks(array('category' => $term_ids)); 

Was nicht funktioniert, weil get_bookmarks() funktioniert .

  $category_query = ''; $join = ''; if ( !empty($category) ) { $incategories = preg_split('/[\s,]+/',$category); if ( count($incategories) ) { foreach ( $incategories as $incat ) { if (empty($category_query)) $category_query = ' AND ( tt.term_id = ' . intval($incat) . ' '; else $category_query .= ' OR tt.term_id = ' . intval($incat) . ' '; } } } 

Hinweis vom Redakteur: Beispielcode zum besseren Verständnis hinzufügen – Lesezeichen werden standardmäßig mit einer OR Klausel abgefragt. Da sie über $wpdb->get_result() abgerufen werden, gibt es keine einfache Lösung beim Filtern neben dem abgefragten Ergebnis.

Jede Hilfe oder Idee eines anderen Ansatzes wäre sehr willkommen.

AKTUALISIEREN

Ich versuche, eine neue function aus der function get_bookmarks () zu machen.

Ich habe den Code, der oben gezeigt wurde, geändert (ODER in AND geändert). Aber jetzt kehrt nichts zurück. Vielleicht muss ich das SQL zu etwas anderem ändern. Also, ich brauche einen Rat zu diesem Thema.

 if ( !empty($category) ) { $incategories = preg_split('/[\s,]+/',$category); if ( count($incategories) ) { foreach ( $incategories as $incat ) { if (empty($category_query)) $category_query = ' AND ( tt.term_id = ' . intval($incat) . ' '; else{ // sisir $category_query .= ' AND tt.term_id = ' . intval($incat) . ' '; } } } } 

Solutions Collecting From Web of "Links in mehreren Kategorien erhalten (Schnittpunkt)"

Es sollte so einfach sein: link_category Sie sich einfach die Begriffe aus der link_category und verwenden get_terms() stattdessen das Argument get_terms() , das so funktionieren sollte, wie Sie es brauchen.

 get_terms( 'link_category' ,array( 'include' => array( 1, 2, 3 ) ,'orderby' => 'name' ,'order' => 'ASC' ,'hierarchical' => 0 ) ); 

Forking get_bookmarks() scheint mühsam, ich würde ein wenig Code (und Cache, wenn es langsam wird). Etwas wie das:

 /** * Retrieve links that have all of the terms assigned. * * @param array $term_ids * * @return array of link objects */ function get_bookmarks_in_terms( $term_ids ) { $bookmark_ids = array(); foreach ( $term_ids as $term_id ) { $bookmarks_in_term = get_objects_in_term( $term_id, 'link_category' ); if ( empty( $bookmarks_in_term ) ) return array(); if ( empty( $bookmark_ids ) ) $bookmark_ids = $bookmarks_in_term; else $bookmark_ids = array_intersect( $bookmark_ids, $bookmarks_in_term ); } if ( empty( $bookmark_ids ) ) return array(); return get_bookmarks( array( 'include' => implode( ',', $bookmark_ids ) ) ); } 

Verwenden Sie get_objects_in_term , um alle Objekte mit diesen Begriffen zu erfassen.

 $objects = get_objects_in_term($term_ids,'link_category'); $links = get_bookmarks(array('include' => $objects ));