問題描述

我想要檢索側邊欄中存在的每個小工具,例如。將它們與主循環中的帖子混合。

我知道我可以使用不同的窗口小工具區域 (側邊欄),但是這種方法把幾百個邊欄的 widget 頁面嵌在一起。為了減輕這個問題,我想把它們添加到一個側邊欄,並在需要時連續檢索。

但我被困了我不知道如何單獨檢索一個小工具。

我的嘗試是使用 wp_get_sidebars_widgetsthe_widget,但是我無法檢索窗口小工具的類名。

這是我的代碼的簡化片段。在這種情況下,我正在嘗試每三個帖子添加一個小工具,但是對邏輯進行過度簡化 (因為我不想只是為了定期添加它們) 來提供這個想法。我想使用 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; ?>

最佳解決方案

我將問題的核心是:「… 我無法檢索窗口小工具類名稱」

您將需要檢查 global 變量 $wp_registered_widgets 來填寫缺少的信息。這個 proof-of-concept 代碼應該給你的想法。該代碼假定一個名為 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' );
}

次佳解決方案

你需要在適當的時間得到它。我建議在 wp 動作鈎。

為此,我們從 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

}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。