web-dev-qa-db-ja.com

サイドバーとは別に各ウィジェットを取得する

サイドバーにある各ウィジェットを順番に取得します。メインループ内のポストとそれらを混ぜる。

私はさまざまなウィジェット領域(サイドバー)を使用できることを知っていますが、この方法ではウィジェット管理ページが数十のサイドバーで散らかっています。これを軽減するために、私はそれらを単一のサイドバーに追加し、必要に応じて連続して取得することを考えました。

しかし、私は立ち往生しています。ウィジェットを個別に取得する方法はわかりません。

私の暫定的なアプローチは wp_get_sidebars_widgetsthe_widget を使うことですが、私はウィジェットクラス名を取得することができません。

これが私のコードの簡単な断片です。この場合、私は3つの記事ごとにウィジェットを追加しようとしていますが、アイデアを提供するためにロジックを単純化しすぎています(定期的に追加したくないため)。私はthe_widgetや他の関数を使ってすべてのウィジェットを視覚化したいです。どうすればこれを達成できますか?出来ますか?

    <?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

私は質問の核心を「……ウィジェットクラス名を取得できません」としています。

不足している情報を入力するには、global変数$wp_registered_widgetsを確認する必要があります。この概念実証コードはあなたにアイデアを与えるはずです。コードはsidebar-1という名前のサイドバーを想定しています。調整する必要があります。

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
}

より多くのガイダンスとして、 dynamic_sidebarがどのように機能するかを見てください 、これは基本的に私が上記を解決するためにしたことです。

テストされていませんが、これは私がいくつかのより完全なコードをモックアップするのに十分興味深いものでした:

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

あなたはそれを適切な時に手に入れる必要があります。 wp actionフックを提案します。

そのために、widgets.php関数で、 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