taxonomy_build_node_index($node)
Builds and inserts taxonomy index entries for a given node.
The index lists all terms that are related to a given node entity, and is therefore maintained at the entity level.
Parameters
\Drupal\node\Entity\Node $node: The node entity.
Related topics
- Taxonomy indexing
- Functions to maintain taxonomy indexing.
File
- core/modules/taxonomy/taxonomy.module, line 501
- Enables the organization of content into categories.
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | function taxonomy_build_node_index( $node ) { // We maintain a denormalized table of term/node relationships, containing // only data for current, published nodes. if (!\Drupal::config( 'taxonomy.settings' )->get( 'maintain_index_table' ) || !(\Drupal::entityManager()->getStorage( 'node' ) instanceof SqlContentEntityStorage)) { return ; } $status = $node ->isPublished(); $sticky = (int) $node ->isSticky(); // We only maintain the taxonomy index for published nodes. if ( $status && $node ->isDefaultRevision()) { // Collect a unique list of all the term IDs from all node fields. $tid_all = array (); $entity_reference_class = 'Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem' ; foreach ( $node ->getFieldDefinitions() as $field ) { $field_name = $field ->getName(); $class = $field ->getItemDefinition()->getClass(); $is_entity_reference_class = ( $class === $entity_reference_class ) || is_subclass_of ( $class , $entity_reference_class ); if ( $is_entity_reference_class && $field ->getSetting( 'target_type' ) == 'taxonomy_term' ) { foreach ( $node ->getTranslationLanguages() as $language ) { foreach ( $node ->getTranslation( $language ->getId())-> $field_name as $item ) { if (! $item ->isEmpty()) { $tid_all [ $item ->target_id] = $item ->target_id; } } } } } // Insert index entries for all the node's terms. if (! empty ( $tid_all )) { foreach ( $tid_all as $tid ) { db_merge( 'taxonomy_index' ) ->key( array ( 'nid' => $node ->id(), 'tid' => $tid , 'status' => $node ->isPublished())) ->fields( array ( 'sticky' => $sticky , 'created' => $node ->getCreatedTime())) ->execute(); } } } } |
Please login to continue.