1. Теперь за форумную активность начисляются биткоины и другие криптоденьги. Подробнее.
    Скрыть объявление
  2. Появилась архивная версия форума arhiv.xaker.name, где собраны темы с 2007 по 2012 год.
    Скрыть объявление

Апгрейдим админку 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 checkedget_post_meta($post->ID'white'1), )?> /> белый</label>

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

             <label><input type="checkbox" name="extra[black]" value="1" <?php checkedget_post_meta($post->ID'black'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 пользователям это понравилось.

Поделиться этой страницей

Загрузка...