$cfg = self::jobs_config( $cat->slug ); list( $jobs, $jtotal ) = self::pick_jobs( $cfg ); $paged = max( 1, (int) get_query_var( 'paged' ) ); self::fill( $root, [ '{sj:cat}' => $name, '{sj:desc}' => self::plain( $cat->description ?: sprintf( 'Alle Artikel aus dem Ressort %s.', $name ) ), '{sj:count_posts}' => number_format_i18n( $cat->count ) . ' Artikel', '{sj:count_jobs}' => $cfg['count'] ? sprintf( $cfg['count'], number_format_i18n( $jtotal ) ) : '', '{sj:jeyebrow}' => $cfg['eyebrow'], '{sj:jtitle_h}' => $cfg['title'], '{sj:jtext}' => $cfg['text'], '{sj:jbutton}' => $cfg['button'], ] ); if ( ! $cfg['count'] || ! $jtotal ) { self::remove( 'sjr-count-jobs' ); } $posts = $wp_query->posts; $slot = self::el( 'sjr-lead-slot' ); $grid = self::el( 'sjr-grid' ); if ( 1 === $paged && $posts && $lead_tpl && $slot ) { $slot->appendChild( self::post_node( $lead_tpl, array_shift( $posts ), $name, 40 ) ); // Aufmacher-Bild sofort laden (sichtbar ohne Scrollen). foreach ( self::$xp->query( './/img', $slot ) as $img ) { $img->setAttribute( 'loading', 'eager' ); $img->setAttribute( 'fetchpriority', 'high' ); } } elseif ( $slot ) { $slot->parentNode->removeChild( $slot ); } if ( $posts && $card_tpl && $grid ) { foreach ( $posts as $p ) { $grid->appendChild( self::post_node( $card_tpl, $p, $name, 18 ) ); } } elseif ( $grid ) { $grid->parentNode->removeChild( $grid ); } $pager = self::el( 'sjr-pager' ); $pages = (int) $wp_query->max_num_pages; if ( $pager && $pg && $pg_on && $pages > 1 ) { if ( $paged > 1 ) { $pager->appendChild( self::clone_link( $pg, get_pagenum_link( $paged - 1 ), [ '{sj:p}' => 'Zurück' ] ) ); } for ( $i = 1; $i <= $pages; $i++ ) { $n = self::clone_link( $i === $paged ? $pg_on : $pg, get_pagenum_link( $i ), [ '{sj:p}' => (string) $i ] ); if ( $i === $paged ) { $n->setAttribute( 'aria-current', 'page' ); } $pager->appendChild( $n ); } if ( $paged < $pages ) { $pager->appendChild( self::clone_link( $pg, get_pagenum_link( $paged + 1 ), [ '{sj:p}' => 'Weiter' ] ) ); } } elseif ( $pager ) { $pager->parentNode->removeChild( $pager ); } $jlist = self::el( 'sjr-jlist' ); if ( $jobs && $jrow && $jlist ) { foreach ( $jobs as $j ) { $jlist->appendChild( self::clone_link( $jrow, get_permalink( $j ), [ '{sj:jtitle}' => self::plain( get_the_title( $j ) ), '{sj:jmeta}' => sjp_meta( $j->ID, 'company', 'Startup' ) . ' · ' . sjp_remote_label( $j->ID ) . ' · ' . sjp_date( $j->ID ), ] ) ); } $btn = self::el( 'sjr-jbutton' ); $a = $btn ? ( 'a' === $btn->nodeName ? $btn : self::$xp->query( './/a', $btn )->item( 0 ) ) : null; if ( $a ) { $a->setAttribute( 'href', home_url( $cfg['url'] ) ); } } else { $panel = $jlist ? $jlist->parentNode : null; if ( $panel && $panel->parentNode ) { $panel->parentNode->removeChild( $panel ); } } $cats = self::el( 'sjr-cats' ); if ( $cats && $c_tpl && $c_on ) { $terms = get_categories( [ 'hide_empty' => true ] ); $order = (array) get_option( 'sj_cat_ids', [] ); if ( $order ) { $pos = array_flip( array_map( 'intval', array_values( $order ) ) ); usort( $terms, fn( $a, $b ) => ( $pos[ $a->term_id ] ?? 99 ) <=> ( $pos[ $b->term_id ] ?? 99 ) ); } foreach ( $terms as $t ) { $on = $t->term_id === $cat->term_id; $n = self::clone_link( $on ? $c_on : $c_tpl, get_category_link( $t ), [ '{sj:c}' => self::plain( $t->name ) ] ); if ( $on ) { $n->setAttribute( 'aria-current', 'page' ); } $cats->appendChild( $n ); } } foreach ( iterator_to_array( self::$xp->query( '//*[starts-with(@id, "sjr-")]' ) ) as $n ) { $n->removeAttribute( 'id' ); } $out = ''; foreach ( $root->childNodes as $c ) { $out .= self::$dom->saveHTML( $c ); } return $out; } }