Truy xuất từng tiện ích riêng biệt từ một thanh bên


7

Tôi muốn truy xuất từng widget hiện có trong một thanh bên để lấy ví dụ như trộn chúng với các bài đăng bên trong vòng lặp chính.

Tôi biết tôi có thể sử dụng các khu vực widget khác nhau (sidebars) nhưng cách tiếp cận này làm tắc nghẽn trang quản trị widget với một số hàng chục sidebars. Để giảm thiểu điều này, tôi nghĩ chỉ cần thêm chúng vào một thanh bên và truy xuất chúng liên tiếp khi cần.

Nhưng tôi bị kẹt. Tôi không biết làm thế nào để lấy riêng một widget.

Cách tiếp cận dự kiến ​​của tôi là sử dụng wp_get_sidebars_widgetsthe_widget nhưng tôi không thể truy xuất tên lớp widget.

Đây là một đoạn mã đơn giản của mã của tôi. Trong trường hợp này, tôi đang cố gắng thêm một widget mỗi ba bài đăng, nhưng là sự đơn giản hóa logic (vì tôi không muốn chỉ cần thêm chúng thường xuyên) để cung cấp cho bạn ý tưởng. Tôi muốn trực quan hóa mọi widget bằng cách sử dụng the_widgethoặc bất kỳ chức năng nào khác. Làm thế nào tôi có thể thực hiện điều này? Có thể không?

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

Câu trả lời:


3

Tôi lấy cốt lõi của câu hỏi là: "... Tôi không thể truy xuất tên lớp widget"

Bạn sẽ cần kiểm tra globalbiến $wp_registered_widgetsđể điền thông tin còn thiếu. Mã bằng chứng này sẽ cung cấp cho bạn ý tưởng. Mã giả định một thanh bên có tên sidebar-1. Bạn sẽ phải điều chỉnh điều đó.

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
}

Để được hướng dẫn thêm, hãy xem cách làm dynamic_sidebarviệc , về cơ bản là những gì tôi đã làm để làm việc ở trên.

Chưa được kiểm tra, nhưng điều này đủ thú vị để tôi chế nhạo một số mã hoàn chỉnh hơn:

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' ); 
}

@furins: xem bản cập nhật
s_ha_dum

Nhìn vào dynamic_sidebarmã nên là cách tiếp cận rõ ràng nhất để làm theo và tôi đã không nghĩ về nó! Bây giờ tôi cảm thấy ngớ ngẩn. +1 cũng cho (chính xác) giảm câu hỏi của tôi xuống một câu. Mã này có một số lỗi nhỏ trên đó nhưng chúng không đáng kể và chúng không thay đổi tính chính xác của câu trả lời vì chúng chỉ xuất ra widget sai (nên là vậy $widgets[$i/3]). Cảm ơn bạn!
furins

Tôi đã hiểu lầm những vật dụng nào được cho là hiển thị ở đâu. Xin lỗi vì điều đó. Vui vì nó đã giúp mặc dù.
s_ha_dum

2

Bạn cần phải có được nó vào đúng thời điểm. Tôi đề nghị trên wpmóc hành động.

Vì vậy, hãy lấy cắp một số mã từ widgets.php, trong dynamic_sidebarhàm:

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

}

Mã này rất mạnh bởi vì nó kiểm tra các biến trước khi sử dụng chúng, tôi sẽ đánh cắp một phần của nó để hợp nhất với câu trả lời của s_ha_dum. Cuối cùng, cả hai cách tiếp cận được trình bày đều đúng nhưng cách tiếp cận của s_ha_dum tập trung hơn vào câu hỏi của tôi và do đó dễ dàng áp dụng hơn cho vấn đề cụ thể của tôi. Tuy nhiên, cảm ơn bạn rất nhiều, nếu tôi chỉ có thể chấp nhận cả hai ...
furins

Điều đó tốt, @furins. Chúng tôi ở đây để giúp đỡ lẫn nhau. Và bằng cách kiểm tra các biến, cuối cùng chúng ta chỉ thấy các thông báo cảnh báo có liên quan.
vmassuchetto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.