it-swarm-eu.dev

Načíst každý widget odděleně od postranního panelu

Chtěl bych načíst každý widget existující v postranním panelu v pořadí např. smíchat s příspěvky uvnitř hlavní smyčky.

Vím, že mohu použít různé oblasti widgetů (sidebars), ale tento přístup zmáčí stránku admin s několika desítkami postranních panelů. Abych to zmírnil, myslel jsem, že je prostě přidám do jediného postranního panelu a v případě potřeby je postupně načíst.

Ale já jsem uvízl. Nemám ponětí o tom, jak získat widget samostatně.

Můj předběžný přístup je použít wp_get_sidebars_widgets a the_widget , ale nejsem schopen získat název třídy widgetu.

Zde je zjednodušený fragment mého kódu. V tomto případě se snažím přidat widget každé tři příspěvky, ale je to přílišné zjednodušení logiky (protože je nechci pravidelně přidávat), abych vám tuto myšlenku poskytla. Chtěl bych si představit každý widget pomocí the_widget nebo jakékoli jiné funkce. Jak toho dosáhnout? Je to možné?

    <?php 
    $i = 1;
    $widgets = wp_get_sidebars_widgets(); // I KNOW THE USE OF THIS IS DISCOURAGED (PRIVATE) BUT CANNOT FIND ALTERNATIVES. 
    if ( have_posts() ) : ?>

        <?php while ( have_posts() ) : the_post(); ?>

            <?php
                if ($i%3 == 0){
                    echo "<h1>WIDGET #".($i/3)."</h1>";
                    the_widget($widgets['homepage-1'][$i/3]); // THIS DOES NOT WORKS SINCE I'M NOT GIVING THE CLASS NAME. HOW TO RETRIEVE IT?
                }
                get_template_part( 'content', get_post_format() );
                $i++;
            ?>

        <?php endwhile; ?>

        <?php _s_paging_nav(); ?>

    <?php else : ?>

        <?php get_template_part( 'content', 'none' ); ?>

    <?php endif; ?>
6
furins

Beru jádro otázky: "... nejsem schopen získat název třídy widgetu"

Budete muset zkontrolovat proměnnou global$wp_registered_widgets, abyste vyplnili chybějící informace. Tento testovací kód by vám měl dát nápad. Kód předpokládá postranní panel s názvem sidebar-1. Budete to muset upravit.

global $wp_registered_widgets;
$widgets = wp_get_sidebars_widgets(); 
var_dump($widgets['sidebar-1']); // dump the data
foreach ($widgets['sidebar-1'] as $widget) {
  var_dump($wp_registered_widgets[$widget]); // dump the data
}

Pro více informací, se podívejte na to, jak dynamic_sidebar funguje , což je v podstatě to, co jsem udělal pro to, abych výše popsal.

Neotestovaný, ale tohle bylo dost zajímavé, že jsem posmíval nějaký další úplný kód:

global $wp_registered_widgets;
$i = 1;
$widgets = wp_get_sidebars_widgets(); 
$widgets = $widgets['homepage-1'];
if ( have_posts() ) { 
  while ( have_posts() ) { 
    the_post(); 
    if ($i%3 == 0){
      echo "<h1>WIDGET #".($i%3)."</h1>";
      $cn = $wp_registered_widgets[$widgets[$i%3]]['callback'][0];
      $cn = get_class($cn);
      the_widget($cn,$widgets[$i%3]);
    }
    get_template_part( 'content', get_post_format() );
    $i++;
  }
  _s_paging_nav(); 
} else {
  get_template_part( 'content', 'none' ); 
}
3
s_ha_dum

Musíte to dostat v pravý čas. Navrhuji na wp akční hák.

Za tímto účelem ukradneme nějaký kód z widgets.php , ve funkci dynamic_sidebar:

add_action( 'wp', 'widgets_run' );
function widgets_run() {

    global $wp_registered_widgets;

    $sidebars_widgets = wp_get_sidebars_widgets();
    if ( empty( $sidebars_widgets ) )
        return false;

    foreach ( (array) $sidebars_widgets as $sidebar_id => $sidebar_widgets ) {

        foreach( $sidebar_widgets as $sidebar_widget ) {

            if ( ! isset( $wp_registered_widgets[ $sidebar_widget ] ) )
                continue;

            $classname_ = '';
                foreach ( (array) $wp_registered_widgets[ $sidebar_widget ]['classname'] as $cn ) {
                if ( is_string($cn) )
                    $classname_ .= '_' . $cn;
                elseif ( is_object($cn) )
                    $classname_ .= '_' . get_class($cn);
            }
            $classnames[] = ltrim($classname_, '_');

        }

    }

    print_r($classnames); // here you are the class names

}
2
vmassuchetto