מפת אתר
// HTML Sitemap shortcode – יוצר מפת אתר לעמוד (לא XML, לא לגוגל)
add_action('init', function () {
  add_shortcode('html_sitemap', function ($atts) {
    $a = shortcode_atts([
      'show_pages'  => '1',      // להציג עמודים
      'pages_depth' => '3',      // עומק היררכיה
      'exclude'     => ",       // IDs להחרגה (12,34)
      'show_posts'  => '1',      // להציג פוסטים
      'by'          => 'category', // category|post_tag
      'show_cpt'    => '1',      // להציג CPT ציבוריים
      'show_dates'  => '0',      // להציג תאריכים
      'cache'       => '1',      // קאש
      'ttl'         => '900',    // שניות קאש
      'title_pages' => 'עמודים',
      'title_posts' => 'פוסטים לפי קטגוריה',
      'title_cpt'   => 'תכנים נוספים',
    ], $atts, 'html_sitemap');
    $key = 'html_sitemap_' . md5(maybe_serialize($a));
    if ($a['cache'] === '1') {
      $cached = get_transient($key);
      if ($cached) return $cached;
    }
    ob_start();
    echo '
    // עמודים (היררכיה)
    if ($a['show_pages'] === '1') {
      echo '
' . esc_html($a['title_pages']) . '
- ';
 - אין עמודים להצגה.
 
$pages = wp_list_pages([
'title_li' => ",
'echo' => 0,
'depth' => intval($a['pages_depth']),
'exclude' => $a['exclude'],
'post_status' => 'publish',
]);
echo $pages ?: '
';
      echo '
';
    }
    // פוסטים לפי קטגוריה/תגיות
    if ($a['show_posts'] === '1') {
      $tax   = ($a['by'] === 'post_tag') ? 'post_tag' : 'category';
      $terms = get_terms(['taxonomy'=>$tax,'hide_empty'=>true]);
      echo '
' . esc_html($a['title_posts']) . '
';
      if (!is_wp_error($terms) && $terms) {
        foreach ($terms as $term) {
          echo '
' . esc_html($term->name) . '
- ';
 - ' . esc_html(get_the_title($p)) . '';
if ($a['show_dates'] === '1') {
echo ' (' . esc_html(get_the_modified_date(get_option('date_format'), $p)) . ')';
}
echo ' - אין פריטים.
 
$posts = get_posts([
'post_type' => 'post',
'posts_per_page' => 100,
'tax_query' => [[ 'taxonomy'=>$tax, 'field'=>'term_id', 'terms'=>$term->term_id ]],
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'exclude' => array_map('intval', array_filter(array_map('trim', explode(',', $a['exclude']))))
]);
if ($posts) {
foreach ($posts as $p) {
echo '
';
            }
          } else {
            echo '
';
          }
          echo '
';
        }
      } else {
        echo '
אין קטגוריות/תגיות להצגה.
';
      }
      echo '
';
    }
    // CPT ציבוריים (שאינם בילט-אין)
    if ($a['show_cpt'] === '1') {
      $pt_objects = get_post_types(['public'=>true, '_builtin'=>false], 'objects');
      if (!empty($pt_objects)) {
        echo '
' . esc_html($a['title_cpt']) . '
';
        foreach ($pt_objects as $pt) {
          echo '
' . esc_html($pt->labels->name) . '
- ';
 - ' . esc_html(get_the_title($it)) . '';
if ($a['show_dates'] === '1') {
echo ' (' . esc_html(get_the_modified_date(get_option('date_format'), $it)) . ')';
}
echo ' - אין פריטים.
 
$items = get_posts([
'post_type' => $pt->name,
'post_status' => 'publish',
'posts_per_page' => 200,
'orderby' => 'title',
'order' => 'ASC',
'exclude' => array_map('intval', array_filter(array_map('trim', explode(',', $a['exclude']))))
]);
if ($items) {
foreach ($items as $it) {
echo '
';
            }
          } else {
            echo '
';
          }
          echo '
';
        }
        echo '
';
      }
    }
echo '
';
    // עיצוב בסיסי קטן
    echo '
';
    $html = ob_get_clean();
    if ($a['cache'] === '1') set_transient($key, $html, intval($a['ttl']));
    return $html;
  });
});





