Как продлить порядок сортировки членов команды - PullRequest
5 голосов
/ 24 мая 2019

Я использую Тема Business Lounge от RT темы с Elementor.

Текущая версия Wordpress (5.2.1)

Вкл.На странице команды (Демо: https://businesslounge -demo.rtthemes.com / our-team / ) есть список карточек членов команды.Я хочу изменить порядок членов команды на параметр, который в настоящее время не выбирается.

Список членов команды выполняется с помощью шорткода [staff_box]

В режиме редактирования Elementor я выгляжу следующим образомthis:
enter image description here

Редактировать:

Форма редактирования определена в
wp-content/plugins/businesslounge-extensions/inc/elementor-addons/staff.php

<?php
namespace Elementor;
// ...
class Widget_RT_Staff extends Widget_Base {
  // ...
  protected function _register_controls() {
    // ...
    $this->add_control(
      'list_orderby',
        [
          'label'     => esc_html_x( 'List Order By', 'Admin Panel','businesslounge' ),
          'description' => esc_html_x('Sorts the posts by this parameter', 'Admin Panel','businesslounge' ),    
          'type'      =>  Controls_Manager::SELECT,
          'default'    =>  "date",
          "options"    => array(
            'date' => esc_html_x('Date',"Admin Panel","businesslounge"),
            'author' => esc_html_x('Author',"Admin Panel","businesslounge"),
            'title' => esc_html_x('Title',"Admin Panel","businesslounge"),
            'modified' => esc_html_x('Modified',"Admin Panel","businesslounge"),
            'ID' => esc_html_x('ID',"Admin Panel","businesslounge"),
            'rand' => esc_html_x('Randomized',"Admin Panel","businesslounge"),                                  
          )
        ]
      );     
      // ...
  }
  // ...
}

Plugin::instance()->widgets_manager->register_widget_type( new Widget_RT_Staff() );
Форма редактирования определена в `wp-content / plugins / businesslounge-extensions / inc / editor / staff_box.php` примерно так
<?php
vc_map(
    array(
        'base'        => 'staff_box',
        'name'        => _x( 'Team', 'Admin Panel','businesslounge' ),
        'icon'        => 'rt_theme rt_team',
        'category'    => array(_x( 'Content', 'Admin Panel','businesslounge' ), _x( 'Theme Addons', 'Admin Panel','businesslounge' )),
        'description' => _x( 'Displays team members', 'Admin Panel','businesslounge' ),
        'params'      => array(
// ...    
          array(
            'param_name'  => 'list_orderby',
            'heading'     => _x( 'List Order By', 'Admin Panel','businesslounge' ),
            "description" => _x("Sorts the posts by this parameter",'Admin Panel','businesslounge'),
            'type'        => 'dropdown',
            "value"       => array(
                                _x('Date','Admin Panel','businesslounge') => 'date',
                                _x('Author','Admin Panel','businesslounge') => 'author',
                                _x('Title','Admin Panel','businesslounge') => 'title',
                                _x('Modified','Admin Panel','businesslounge') => 'modified',
                                _x('ID','Admin Panel','businesslounge') => 'ID',
                                _x('Randomized','Admin Panel','businesslounge') => 'rand',
                            ),
            'save_always' => true
        ),
// ...

Выходные данные определены в
wp-content/plugins/businesslounge-extensions/inc/shortcodes/staff_box.php

примерно так:

<?php
function rt_staff( $atts, $content = null ) { 
// ...

    //defaults
    extract(shortcode_atts(array(  
        "id"           => 'staff-'.rand(100000, 1000000), 
        "class"        => "", 
        "list_layout"  => "1/1", 
        "list_orderby" => "date",
        "list_order"   => "DESC",
        "ids"          => array(),
        "box_style"    => ""        
    ), $atts));

// ...

    //general query
    $args=array( 
        'post_status'    => 'publish',
        'post_type'      => 'staff',
        'orderby'        => $list_orderby,
        'order'          => $list_order,
        'showposts'      => 1000                                                            
    );
// ...
    $theQuery = query_posts($args);
// ...

Что я хочу сделать: Добавить опцию 'post_name' в поле выбора, чтобы я мог отсортировать команду по другому полю.Я хочу добавить 'Post name' => 'post_name',

Как я могу сделать это без изменения исходного кода?
У меня уже активирована дочерняя тема темы business_lounge.
Нужно ли для этого собственное расширение

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Вы должны изменить исходный код.Вы не можете переопределить функцию, если автор не применил filter к возвращенному значению или не использовал action.

Как отмечает Гаэль в своемответ, вы можете смягчить удар по потере изменений в обновлениях, скопировав исходный код в functions.php вашей дочерней темы, затем переименовав функцию - например, на my_rt_staff() перед добавлением ваших модификаций.

Однако вы быпо-прежнему нужно вызывать my_rt_staff() в плагине вместо rt_stuff, и вам придется вносить это изменение всякий раз, когда плагин обновляется, но вы не потеряете свой код.

(возможно, вы могли бы изменить"list_orderby" => "date" в атрибутах шорткода по умолчанию для "list_orderby" => "post_name", по умолчанию в вашем модифицированном методе my_rt_staff(), поэтому он упорядочивается по имени по умолчанию вместо даты)

Однако это мало помогает в ваших конкретных обстоятельствах, так как идеальная модификация, которую вам нужно сделать, - это сам элемент управления, метод _register_controls() в классе Widget_RT_Staff.Вы можете переопределить это, расширив Widget_RT_Staff, но вам все равно нужно будет вызвать новый класс, что приведет к изменению кода плагина.

Не видя, как класс Widget_RT_Staff влияет на ShortCode, я не могу быть уверен, что это сработает, но на основе метода rt_staff(), если вы используете шорткод в качестве [staff_box orderby="post_name"], вы можете получитьожидаемый результат без необходимости касаться какого-либо кода.

0 голосов
/ 27 мая 2019

Вы должны иметь возможность изменять свой плагин, не теряя способности к обновлению, «переопределяя» функцию, как описано здесь:

https://stackoverflow.com/a/40856197/3623080

Сделайте копию функции у вашего ребенка.functions.php темы, настройте и переименуйте ее, используйте вместо оригинальной функции.

Надеюсь, это поможет

...