get_current_doc_id(); $current_hub_id = 0; $doc_hubs = wp_get_post_terms( $current_doc_id, 'docs_hub', ['fields' => 'ids'] ); // Check for explicit Hub assignments if(!empty($doc_hubs) && !is_wp_error($doc_hubs)){ $current_hub_id = $doc_hubs[0]; } else{ // If no explicit Hub, check its Categories for a mapped Hub $doc_cats = wp_get_post_terms( $current_doc_id, 'docs_category', ['fields' => 'ids'] ); if(!empty($doc_cats) && !is_wp_error($doc_cats)){ foreach($doc_cats as $cat_id){ $mapped_hubs = get_term_meta($cat_id, 'documentor_associated_hubs', false); // Grab the first valid Hub mapped to this category if(!empty($mapped_hubs) && is_array($mapped_hubs)){ $current_hub_id = $mapped_hubs[0]; break; } } } } // Fetch only the docs for that hub $include_ids = []; if($current_hub_id > 0){ // Find all categories that belong to this specific Hub $matching_cats = get_terms([ 'taxonomy' => 'docs_category', 'meta_query' => [ [ 'key' => 'documentor_associated_hubs', 'value' => $current_hub_id, 'compare' => '=' ] ], 'fields' => 'ids' ]); $cat_count = (!empty($matching_cats) && !is_wp_error($matching_cats)) ? count($matching_cats) : 0; $tax_query = ['relation' => 'OR']; // Always allow docs explicitly assigned to this Hub. $tax_query[] = array( 'taxonomy' => 'docs_hub', 'field' => 'term_id', 'terms' => $current_hub_id ); // Also allow docs with no explicit Hub if they belong to a mapped category. if($cat_count > 0){ $tax_query[] = array( 'relation' => 'AND', array('taxonomy' => 'docs_category', 'field' => 'term_id', 'terms' => $matching_cats), array('taxonomy' => 'docs_hub', 'operator' => 'NOT EXISTS') ); } // Run the database query to get just the matching document IDs $docs_query = new WP_Query(array( 'post_type' => 'docs', 'posts_per_page' => -1, 'fields' => 'ids', 'tax_query' => $tax_query )); if(!empty($docs_query->posts)){ $include_ids = $docs_query->posts; } else{ $include_ids = array(0); } } $args = array( 'title_li' => '', 'order' => 'menu_order', 'child_of' => empty($el['atts']['hide_parent']) ? 0 : $current_doc_id, 'echo' => false, 'post_type' => 'docs', 'walker' => new Documentor_Walker_Docs(), ); if(!empty($include_ids)){ $args['include'] = implode(',', $include_ids); } $nav_list = wp_list_pages($args); if($nav_list){ $html = ''; $html .= ''; } $el['atts']['post_html'] = $html; } function pagelayer_sc_dm_feedback(&$el){ $show_counts = $el['atts']['show_counts']; $positive_title = $el['atts']['positive_title']; $negative_title = $el['atts']['negative_title']; $el['atts']['pcount'] = ''; $el['atts']['ncount'] = ''; $no_votes = $el['atts']['no_votes']; $positive = (int) get_post_meta( get_the_ID(), 'positive', true ); $negative = (int) get_post_meta( get_the_ID(), 'negative', true ); if($show_counts){ $el['atts']['positive_title'] = $positive ? sprintf( '%s %s', number_format_i18n( $positive ), $positive_title ) : $no_votes; $el['atts']['negative_title'] = $negative ? sprintf( '%s %s', number_format_i18n( $negative ), $negative_title ) : $no_votes; } if($positive){ $el['atts']['pcount'] = ''. esc_html( number_format_i18n( $positive ) ) .''; } if($negative){ $el['atts']['ncount'] = ''. esc_html( number_format_i18n( $negative ) ) .''; } } function pagelayer_sc_dm_article(&$el){ $children = wp_list_pages( 'title_li=&order=menu_order&child_of=' . get_the_ID() . '&echo=0&depth=1&post_type=' . get_post_type() ); if(!$children && (pagelayer_is_live() || wp_doing_ajax())){ $children = '
  • Sub Category 1
  • Sub Category 2
  • '; } if(!$children){ $el['atts']['heading'] = ''; } $el['atts']['post_html'] = $children; } function pagelayer_sc_dm_title(&$el){ global $post; $title = pagelayer_is_live() ? "Title" : get_the_title( ); $el['atts']['title'] = $title; } function pagelayer_sc_dm_breadcrumbs(&$el){ $breadcrumbs = documentor()->get_breadcrumbs_array(); $html = ''; foreach( $breadcrumbs as $k => $crumb ){ if( $k > 0 ){ $html .= '
  • '. $el['atts']['separator'].'
  • '; } $html .= '
  • '; if(isset($crumb['url'])) $html .= ''; $html .= ''. esc_html( $crumb['label'] ) .''; if(isset($crumb['url'])) $html .= ''; $html .= ''; $html .= '
  • '; } $el['atts']['post_html'] = $html; } function pagelayer_sc_dm_adjacent_links(&$el){ $html = ''; $prev_post_id = documentor()->get_previous_adjacent_doc_id(); $next_post_id = documentor()->get_next_adjacent_doc_id(); if($prev_post_id || $next_post_id){ $html = ''; } $el['atts']['post_html'] = $html; } function pagelayer_sc_dm_archive_box(&$el){ global $wp_query; $is_editor = (pagelayer_is_live() || wp_doing_ajax()); // Check if current page is a a linked Hub $is_hub_page = false; if(is_page()){ $linked_hub = get_post_meta(get_the_ID(), '_documentor_linked_hub_id', true); if(!empty($linked_hub)){ $is_hub_page = true; } } //Check if we are on the Main Documentation Archive Page $is_main_docs_page = (!is_tax('docs_hub') && !$is_hub_page && !is_search() && !$is_editor); $html = ''; $show_hub_grid = false; $hub_grid_html = ''; if(pagelayer_is_live() || wp_doing_ajax()){ $args = array( 'post_type' => 'docs', 'posts_per_page' => -1, // phpcs:ignore 'post_parent' => 0, 'orderby' => array( 'menu_order' => 'ASC', 'date' => 'DESC', ), ); $wp_query = new WP_Query( $args ); } // Fetch the Hub ID from either the Taxonomy OR the Page $selected_hub_id = 0; if(is_tax('docs_hub')){ $selected_hub_id = get_queried_object_id(); } elseif(is_page()){ $linked_hub = get_post_meta(get_the_ID(), '_documentor_linked_hub_id', true); if(!empty($linked_hub)){ $selected_hub_id = intval($linked_hub); } } $matching_cats = array(); if($selected_hub_id > 0){ $matching_cats = get_terms(array( 'taxonomy' => 'docs_category', 'meta_query' => array( array( 'key' => 'documentor_associated_hubs', 'value' => $selected_hub_id, 'compare' => '=' ) ), 'fields' => 'ids' )); if(is_wp_error($matching_cats)) $matching_cats = array(); } $current_term = false; if( have_posts()){ while ( have_posts() ){ // Set up global $post data for the current document the_post(); $terms = wp_get_post_terms( get_the_ID(), 'docs_category' ); $hubs = wp_get_post_terms(get_the_ID(), 'docs_hub'); $display_term_name = false; if(empty($selected_hub_id) && !empty($hubs)){ continue; } elseif(!empty($selected_hub_id)){ $has_selected_hub = false; if(!empty($hubs) && !is_wp_error($hubs)){ foreach($hubs as $hub){ if(!empty($hub->term_id) && $selected_hub_id === intval($hub->term_id)){ $has_selected_hub = true; break; } } } if(!$has_selected_hub && !empty($hubs)){ continue; } if($terms && !empty($terms)){ if(!empty($matching_cats)){ foreach($terms as $t){ if(in_array($t->term_id, $matching_cats)){ $display_term_name = $t->name; break; } } } if(!$has_selected_hub && !$display_term_name){ continue; } } elseif(!$has_selected_hub){ continue; } } if($terms && !empty($terms) && !$display_term_name){ // Look through the doc's categories and find the one that belongs to this Hub $display_term_name = $terms[0]->name; } // Print the Correct Header if($display_term_name && $current_term !== $display_term_name){ $current_term = $display_term_name; $html .= '
  • '; $html .= esc_html($current_term); $html .= '
  • '; } $html .= '
  • '; $html .= documentor_loop_title($el['atts']); $html .= documentor_loop_articles($el['atts']); $html .= '
  • '; } } elseif(pagelayer_is_live() || wp_doing_ajax()){ $html .= '
  • '; $html .= documentor_loop_title($el['atts']); $html .= documentor_loop_articles($el['atts']); $html .= '
  • '; } $el['atts']['post_html'] = $html; } function documentor_loop_title($atts){ $html = ''; $articles = get_pages( array( 'child_of' => get_the_ID(), 'post_type' => 'docs', ) ); $articles_count = count( $articles ); $html .= ''; if($atts['hicon']){ $html .= ''; } $html .= get_the_post_thumbnail( '','documentor_archive' ); $html .= ''; $html .= ''; $html .= sprintf( esc_html( _n( '%s Article', '%s Articles', $articles_count, 'documentor' ) ), esc_html( $articles_count ) ); $html .= ''; $html .= '

    '. get_the_title() .'

    '; $html .= '
    '; $html .= '
    '; return $html; } function documentor_loop_articles($atts){ $html =''; $show = $atts['show_articles']; $articles_number = $atts['articles_depth']; if ( -1 === $articles_number ) { $articles_number = 9999; } if ( ! $show || $articles_number < 1 ) { return; } $top_articles = new WP_Query( array( 'post_type' => 'docs', 'posts_per_page' => -1, // phpcs:ignore 'post_parent' => get_the_ID(), 'orderby' => array( 'menu_order' => 'ASC', 'date' => 'DESC', ), ) ); $parent_link = get_permalink(); $count = 0; $nav_list = wp_list_pages( array( 'title_li' => '', 'order' => 'menu_order', 'child_of' => documentor()->get_current_doc_id(), 'echo' => false, 'post_type' => 'docs', 'icon' => $atts['icon'], 'depth' => $articles_number, 'walker' => new Documentor_Walker_Docs(), ) ); if(!$nav_list && (pagelayer_is_live() || wp_doing_ajax())){ $nav_list = '
  • List
  • '; } if ($nav_list) { $show_childs = documentor()->get_option( 'sidebar_show_nav_childs', 'documentor_single', false ); $html .= '
    '; $html .= ''; $html .= '
    '; } wp_reset_postdata(); return $html; } function pagelayer_sc_dm_hub_list(&$el){ $hubs = get_terms([ 'taxonomy' => 'docs_hub', 'hide_empty' => false, ]); if(empty($hubs)){ $el['atts']['hub_list_html'] = !empty($el['no_hub']) ? $el['no_hub'] : __('No Doc Hub created yet', 'documentor'); return; } if(is_wp_error($hubs)){ $el['atts']['hub_list_html'] = $hubs->get_error_message(); return; } $active_hubs_count = 0; $boxes_html = ''; foreach($hubs as $hub){ $hub_id = $hub->term_id; $sections = get_posts([ 'post_type' => 'docs', 'post_status' => 'publish', 'posts_per_page' => -1, 'fields' => 'ids', 'post_parent' => 0, 'tax_query' => [ [ 'taxonomy' => 'docs_hub', 'field' => 'term_id', 'terms' => $hub_id, ], ], ]); if(empty($sections)) { continue; } $query = new \WP_Query([ 'post_type' => 'docs', 'post_status' => 'publish', 'post_parent__in' => $sections, 'posts_per_page' => -1, 'fields' => 'ids', ]); $section_count = count($sections); $doc_count = (int) $query->found_posts; // Now we need to get all the sub child docs id if(!empty($query->posts) && is_array($query->posts)){ $query = new \WP_Query([ 'post_type' => 'docs', 'post_status' => 'publish', 'post_parent__in' => $query->posts, 'posts_per_page' => -1, 'fields' => 'ids', ]); $doc_count += (int) $query->found_posts; } if($section_count === 0 && $doc_count === 0){ continue; } $active_hubs_count++; // Robustly find the linked Page URL (Check Term Meta, then Post Meta) $page_url = get_term_link($hub); // Format text grammar $section_text = $section_count === 1 ? '1 Section' : $section_count . ' Sections'; $doc_text = $doc_count === 1 ? '1 Doc' : $doc_count . ' Docs'; $boxes_html .= ''; $boxes_html .= '' . esc_html($hub->name) . ''; $boxes_html .= '' . $section_text . ' • ' . $doc_text . ''; $boxes_html .= ''; } if($active_hubs_count <= 0){ $el['atts']['hub_list_html'] = !empty($el['no_hub']) ? $el['no_hub'] : 'No Doc Hub found'; return; } $el['atts']['hub_list_html'] = $boxes_html; }