Апгрейдим админку WP

Тема в разделе "PHP, Perl и др.", создана пользователем хопкинс, 9 май 2014.

  1. хопкинс
    хопкинс Продвинутый
    Симпатии:
    35
    Небольшое отступление

    Приношу свои глубочайшие извинения за то, что не нахожу времени написать очередную статейку. Постараюсь загладить свою вину данным постом).
    Итак. Наверное все, кто сталкивался с WP(Да и с любым другим движком) неоднократно сталкивался с задачей - Добавление своих полей в админку. При этом случаи у всех были разные. Кто-то создавал подобие магазина, (как я:)), Кто-то просто необычным образом выводил посты. Но в любом случае такая необходимость была. Вот и у меня попался заказ - Нужно было создать сайт визитку швейцарских часов. И первое, что мне бросилось в глаза- это характеристики моделей часов. И я сразу понял, что придется добавлять дополнительные поля для поста...Хотя если быть совсем откровенным - до этого момента я ни разу не сталкивался с WP./facepalm.Ну что, засучим рукава и в бой?!:angry:
    Часть первая. Разведка

    Первое, что бросается в глаза - шаблон разделен на несколько файлов.(шапка,контент,футер) в разных файлах. Но это я немного отступил от темы. Я узнал, что мне понадобится два хука. add_meta_boxes (или admin_init) и save_post. хорошо хоть документации навалом).

    Часть вторая.Создание блока.

    Немного осмотревшись я понял, что ничего страшного нет*xD*. Опять таки Это открытый движок. Чего нам боятся?!:)
    Настал момент истины. Барабанная дробь....и начинаем кодить)

    Создадим новый мета блок для постов (записей типа post) с названием "Дополнительные поля":

    PHP:
    <?php // подключаем функцию активации мета блока (my_extra_fields) add_action('add_meta_boxes', 'my_extra_fields', 1);  function my_extra_fields() {     add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high'  ); }
    Заполним этот блок полями html формы, делается это через, указанную в add_meta_box() функцию extra_fields_box_func(). Именно она отвечает за содержание мета блока:
    PHP:
    function extra_fields_box_func( $post ){ ?>  
       <p>
    Описание характеристики (characteristic):
    <textarea type="text" name="extra[characteristic]" style="width:100%;height:50px;">
    <?php echo get_post_meta($post->ID, 'characteristic', 1); ?>
    </textarea>
    </p>

    //Здесь могут быть любые поля *. Радио, селекты и т.д. <?php }
    Все названия полей я оформил в массив extra[], чтобы потом проще было обработать эти данные.
    Спрятанное поле name="extra_fields_nonce", нужно для проверки при сохранении данных.

    Часть 3. Юзаем хук

    ​
    На этом этапе, мы уже создали блок произвольных полей, теперь нужно обработать данные полей при сохранении поста. Обработать, значит записать их в произвольные поля (в таблицу БД) или наоборот удалить. Для этого используем хук save_post, который срабатывает в момент сохранения поста. В этот момент мы получим данные из массива extra[] и обработаем них:
    PHP:
    <?php // включаем обновление полей при сохранении 

    add_action('save_post', 'my_extra_fields_update', 0);  
    /* Сохраняем данные, при сохранении поста */

     
    function my_extra_fields_update( $post_id )
    {     if ( !
    wp_verify_nonce($_POST['extra_fields_nonce'], __FILE__) ) return false;
     
    // проверка  
       
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE  )
     return 
    false;
     
    // выходим если это автосохранение 
        
    if ( !current_user_can('edit_post', $post_id) ) 
    return 
    false;
     
    // выходим если юзер не имеет право редактировать запись 
         
    if( !isset($_POST['extra']) ) 
    return 
    false;
        
    // выходим если данных нет 
      
       // Все ОК! Теперь, нужно сохранить/удалить данные     

    $_POST['extra'] = array_map('trim', $_POST['extra']); 

    // чистим все данные от пробелов по краям   

      
    foreach( $_POST['extra'] as $key=>$value ){  
           if( empty(
    $value) ){   
              
    delete_post_meta($post_id, $key);

     
    // удаляем поле если значение пустое    
             
    continue;         }     
         
    update_post_meta($post_id, $key, $value); 

    // add_post_meta() работает автоматически  
     
      
    }     return $post_id; } ?>


    Вот и все, блок произвольных полей готов!
    Теперь, изменяя html код, мы можем редактировать содержимое блока. Но не забываем, что названия полей имеют вид массива со значением ключа произвольно поля: name="extra[meta_key]".

    Часть 4. Дополнения
    ​

    Если нужно создать блок для другого типа записей, допустим page (для страниц), то регистрируем еще один мета блок и описываем его html код в новой функции, которую так же нужно указать при регистрации блока (extra_fields_box_page_func). Функцию обработки полей при сохранении поста создавать уже не надо, главное указать названия полей в виде массивов extra[]:​

    PHP:
    function my_extra_fields()
     {     add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high'  );    

     add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_page_func', 'page', 'normal', 'high'  ); }  

    // html код блока для типа записей page function extra_fields_box_page_func(){    ?>  

      ---------- Здесь поля html формы -----------    <?php }
    *- Нельзя использовать поля типа checkbox.:(. Но есть костыль;):
    PHP:
    <?php  

    // подключаем функцию активации мета блока (my_extra_fields) 

    add_action('admin_init', 'my_extra_fields', 1); 
     function 
    my_extra_fields() {     add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high'  ); 
    }  

    // код блока function extra_fields_box_func( $post ){ ?>


    <p>

    Описание характеристики (characteristic):  
            <textarea type="text" name="extra[characteristic]" style="width:100%;height:50px;">
    <?php echo get_post_meta($post->ID, 'characteristic', 1); ?>
    </textarea>    
     </p>

            <p>     

         <label><input type="checkbox" name="extra[white]" value="1" <?php checked( get_post_meta($post->ID, 'white', 1), 1 )?> /> белый</label>

             <label><input type="checkbox" name="extra[red]" value="1"   <?php checked( get_post_meta($post->ID, 'red',   1), 1 )?> /> красный</label>

             <label><input type="checkbox" name="extra[black]" value="1" <?php checked( get_post_meta($post->ID, 'black', 1), 1 )?> /> черный</label>   

      </p>    

      <input type="hidden" name="need_check" value="white,red,black" />     <input type="hidden" name="extra_fields_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" /> <?php } 

     
    // включаем обновление полей при сохранении add_action('save_post', 'my_extra_fields_update', 0); 

     /* Сохраняем данные, при сохранении поста */

     
    function my_extra_fields_update( $post_id ){     if ( !wp_verify_nonce($_POST['extra_fields_nonce'], __FILE__) ) return false; 

    // проверка     if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE  ) return false;

     // если это автосохранение     if ( !current_user_can('edit_post', $post_id) ) return false;

     // если юзер не имеет право редактировать запись      if( !isset($_POST['extra']) ) return false;     

         //extra[white] указываем поля (checkbox), могут не определиться и не удаляться     $need_check = array_map( 'trim', explode(',', $_POST['need_check']) );     foreach( $need_check as $val )         $_POST['extra'][$val] = @$_POST['extra'][$val];   

       // Все ОК! Теперь, нужно сохранить/удалить данные     

    $_POST['extra'] = array_map('trim', $_POST['extra']);     foreach( $_POST['extra'] as $key=>$value ){         if( empty($value) )             delete_post_meta($post_id, $key);

     
    // удаляем поле если значение пустое             continue;          update_post_meta($post_id, $key, $value);

     // add_post_meta() работает автоматически

         
    }     return $post_id; }


    Заключение​



    Пи.Си. Если у вас есть прямые руки, знание html и php - У вас все получится!...Да Да...можно было воспользоваться плагинами. Но не мне вам рассказывать в чем отличие готовый сборки - от вашей). Всем спасибо. Все свободны
    .:thx:
    ​
     
    9 май 2014
    2 пользователям это понравилось.
Загрузка...