เพิ่มคลาสให้กับ before_widget จากภายในวิดเจ็ตที่กำหนดเอง


10

ฉันมีวิดเจ็ตที่กำหนดเองง่าย ๆ ที่ขอความกว้างของมัน (ซึ่งจะใช้ในภายหลังในส่วนหน้า) ฟิลด์ความกว้างเป็นแบบเลื่อนลงแบบเลือกดังนั้นผู้ใช้จึงมีตัวเลือกที่กำหนดไว้ล่วงหน้า

ฉันจะมีอินสแตนซ์จำนวนมากของวิดเจ็ตของฉันแต่ละคนจะมีการตั้งค่าความกว้างของตัวเอง

ตอนนี้ในรหัสวิดเจ็ตของฉันฉันมีรหัสต่อไปนี้:

echo $before_widget;

ซึ่งผลลัพธ์ใน:

<div class="widget my" id="my-widget-1"></div>

สิ่งที่ฉันต้องการจะทำคืออย่างใดขอ$before_widgetและเพิ่มชั้นเรียนของฉันเอง (ความกว้างที่ระบุจากแบบเลื่อนลงเลือก) ดังนั้นฉันต้องการมาร์กอัปต่อไปนี้:

<div class="widget my col480" id="my-widget-3"></div>

class="col480"และหากมีระดับไม่ระบุแล้วฉันต้องการที่จะเพิ่ม

ฉันจะบรรลุสิ่งนี้ได้อย่างไร

ขอบคุณที่ช่วยเหลือ! Dasha

คำตอบ:


14

Aha ดังนั้น$before_widgetตัวแปรเป็นสตริงที่เป็นตัวแทนของส่วน <div class="widget my" id="my-widget-1">div: ดังนั้นฉันจึงตรวจสอบ$before_widgetสตริงย่อย "class" และเพิ่ม$widget_widthมูลค่าของฉันลงไป

รหัสมาจากไฟล์วิดเจ็ตที่กำหนดเองของฉัน:

function widget( $args, $instance ) {
  extract( $args );
  ... //other code

  $widget_width = !empty($instance['widget_width']) ? $instance['widget_width'] : "col300";
  /* Add the width from $widget_width to the class from the $before widget */
  // no 'class' attribute - add one with the value of width
  if( strpos($before_widget, 'class') === false ) {
    // include closing tag in replace string
    $before_widget = str_replace('>', 'class="'. $widget_width . '">', $before_widget);
  }
  // there is 'class' attribute - append width value to it
  else {
    $before_widget = str_replace('class="', 'class="'. $widget_width . ' ', $before_widget);
  }
  /* Before widget */
  echo $before_widget;

  ... //other code
}

ฉันต้องการเพิ่ม$widget_widthตัวแปรของฉันลงในองค์ประกอบเครื่องมือวิดเจ็ตภายในรหัสวิดเจ็ตของตัวเอง (ในขณะที่ฉันเข้าถึง$widget_widthตัวแปรได้ง่าย)

หวังว่าเหมาะสมและจะช่วยให้ใครบางคน

ขอบคุณ Dasha


การทำงานที่ดี - ช่วยฉันออกมาพร้อมกับปัญหาวิดเจ็ต - ขอบคุณ :)
Q Studio

10

คุณสามารถใช้dynamic_sidebar_paramsfilter hook เพื่อค้นหาวิดเจ็ตของคุณและเพิ่มคลาสของคุณ:

add_filter('dynamic_sidebar_params', 'add_classes_to__widget'); 
function add_classes_to__widget($params){
    if ($params[0]['widget_id'] == "my-widget-1"){ //make sure its your widget id here
        // its your widget so you add  your classes
        $classe_to_add = 'col480 whatever bla bla '; // make sure you leave a space at the end
        $classe_to_add = 'class=" '.$classe_to_add;
        $params[0]['before_widget'] = str_replace('class="',$classe_to_add,$params[0]['before_widget']);
    }
    return $params;
} 

ขอบคุณสำหรับการตอบกลับ. ฉันจะมีอินสแตนซ์ของวิดเจ็ตที่กำหนดเองจำนวนมากแต่ละอันมีความกว้างเฉพาะของตัวเอง นั่นเป็นเหตุผลที่ฉันต้องการเพิ่มคลาสพิเศษภายในโค้ดวิดเจ็ตแทนที่จะใช้ผ่านตัวกรอง หวังว่าจะสมเหตุสมผล
dashaluna

ตัวเลือกอินสแตนซ์ที่ดีจะถูกบันทึกไว้ในตารางตัวเลือกเพื่อให้คุณสามารถรับได้จากที่นั่นเมื่อคุณรู้ว่า id ของวิดเจ็ตที่ใช้get_option('widget-name')
Bainternet

1
ขอบคุณมาก ๆ สำหรับความช่วยเหลือของคุณ! ฉันขอโทษที่ฉันไม่เข้าใจวิธีแก้ปัญหาของคุณ :( และฉันต้องการให้รหัสทั้งหมดอยู่ในไฟล์วิดเจ็ตที่กำหนดเองของฉันในขณะที่ฉันสามารถเข้าถึงตัวแปรความกว้างได้อย่างง่ายดายฉันลงเอยด้วยการแฮ็ค$before_widgetสตริง การค้นพบเส้นทางที่$before_widgetถูกต้องนั้นเป็นสตริงขอขอบคุณอีกครั้ง :)
dashaluna

นี่จะเป็นตัวเลือกที่ต้องการเนื่องจากใช้ตัวกรองเวิร์ดเพรสแทนการแก้ไขไฟล์ธีม
rhysclay

6

อีกวิธีหนึ่งที่ฉันพบเพื่อเพิ่มคลาสสำหรับวิดเจ็ตที่กำหนดเองคือการใช้คีย์ ' classname ' ของฟังก์ชันการสร้างของคุณเหมือนใน:

class My_Widget_Class extends WP_Widget {
// Prior PHP5 use the children class name for the constructor…
// function My_Widget_Class()
       function __construct() {
            $widget_ops = array(
                'classname' => 'my-class-name',
                'description' => __("Widget for the sake of Mankind",'themedomain'),
            );
            $control_ops = array(
                'id_base' => 'my-widget-class-widget'
            );
   //some more code after...

   // Call parent constructor you may substitute the 1st argument by $control_ops['id_base'] and remove the 4th.
            parent::__construct(@func_get_arg(0),@func_get_arg(1),$widget_ops,$control_ops);
        }
}

และอย่าลืมใช้ค่าเริ่มต้น ' before_widget ' ในธีมของคุณหรือถ้าคุณใช้register_sidebar()ใน function.php ให้ทำดังนี้:

//This is just an example.
register_sidebar(array(
          'name'=> 'Sidebar',
            'id' => 'sidebar-default',
            'class' => '',//I never found where this is used...
            'description' => 'A sidebar for Mankind',
            'before_widget' => '<aside id="%1$s" class="widget %2$s">',//This is the important code!!
            'after_widget' => '</aside>',
            'before_title' => '<h3>',
            'after_title' => '</h3>',
        ));

จากนั้นทุกวิดเจ็ตของคุณคุณจะมีคลาส 'วิดเจ็ต my-class-name' ดังนี้:

<aside class="widget my-class-name" id="my-widget-class-widget-N"><!-- where N is a number -->
  <h3>WIDGET TITLE</h3>
  <p>WIDGET CONTENT</p>
</aside>

คุณอาจเรียกผู้สร้างหลักก่อนแล้วต่อท้ายชื่อคลาสที่คุณต้องการ:

class My_Widget_Class extends WP_Widget {
    // Better defining the parent argument list …
    function __construct($id_base, $name, $widget_options = array(), $control_options = array())
    {    parent::__construct($id_base, $name, $widget_options, $control_options);
         // Change the class name after
         $this->widget_options['classname'].= ' some-extra';
    }
}

1

ก่อนอื่นให้เพิ่มคลาสตัวยึดตำแหน่งที่กำหนดเองในตัวสร้าง

<?php
public function __construct() {
   $widget_ops  = array(
      'classname'                   =>; 'widget_text eaa __eaa__', //__eaa__ is my placeholder css class
      'description'                 =>; __( 'AdSense ads, arbitrary text, HTML or JS.','eaa' ),
      'customize_selective_refresh' =>; true,
   );
   $control_ops = array( 'width' =>; 400, 'height' =>; 350 );
   parent::__construct( 'eaa', __( 'Easy AdSense Ads &amp; Scripts', 'eaa' ), $widget_ops, $control_ops );
}
?>

จากนั้นแทนที่ด้วยคลาส / es ที่คุณเลือกตามตัวเลือกวิดเจ็ตเช่นนี้

<?php
if ( $instance['no_padding'] ) {
   $args['before_widget'] = str_replace( '__eaa__', 'eaa-clean', $args['before_widget'] );
}
?>

คุณสามารถค้นหารายละเอียดพร้อมตัวอย่างได้ที่ http://satishgandham.com/2017/03/adding-dynamic-classes-custom-wordpress-widgets/


0

คุณสามารถลองใช้ตัวกรองนี้:

/**
 * This function loops through all widgets in sidebar 
 * and adds a admin form value to the widget as a class name  
 *  
 * @param array $params Array of widgets in sidebar
 * @return array
*/

add_filter( 'dynamic_sidebar_params', 'nen_lib_add_class_to_widget' );
function nen_lib_add_class_to_widget( $params )
{
    foreach( $params as $key => $widget )
    {
        if( !isset($widget['widget_id']) ) continue;

        // my custom function to get widget data from admin form (object)
        $widget_data = nen_get_widget_data($widget['widget_id']) ;

        // check if field excists and has value
        if( isset($widget_data->wm_name) && $widget_data->wm_name )
        {
            // convert and put value in array
            $classes = array( sanitize_title( $widget_data->wm_name ) );

            // add filter, to be able to add more
            $classes = apply_filters( 'nen_lib_add_class_to_widget' , $classes , $widget['widget_id'] , $widget , $widget_data  );

            // get 'before_widget' element, set find and replace
            $string     = $params[$key]['before_widget'];
            $find       = '"widget ';
            $replace    = '"widget '.implode( ' ' , $classes ).' ';

            // new value
            $new_before = str_replace( $find , $replace , $string ) ;

            // set new value
            $params[$key]['before_widget'] = $new_before;
        }
    }
    return $params;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.