Карта сайта OSmap(Xmap) для мультиязычного сайта Joomla 3

Есть пара способов создания карты сайта для мультиязычного сайта… Но мы пока рассмотрим один.

OSmap это бывшая Xmap, к которой вроде как все привыкли, она была простой и удобной…

Следите чтобы ссылки, а именно id и префикс языка были верны. Не забудьте так же изменить имя вашего домена — (http://www.test.ru) — измените на свой.

Способ 1:

Нужно создать файл sitemap.xml в корне сайта, с таким содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
 <sitemap>
 <loc><a href="http://www.test.ru/index.php?option=com_xmap&amp;view=xml&amp;id=1&amp;lang=ru</loc>" rel="nofollow" target="_blank" >http://www.test.ru/index.php?option=com_xmap&amp;view=xml&amp;id=1&amp;lang=ru</loc></a>
 </sitemap>
 <sitemap>
 <loc><a href="http://www.test.ru/index.php?option=com_xmap&amp;view=xml&amp;id=2&amp;lang=en</loc>" rel="nofollow" target="_blank" >http://www.test.ru/index.php?option=com_xmap&amp;view=xml&amp;id=2&amp;lang=en</loc></a>
 </sitemap>
 <sitemap>
 <loc><a href="http://www.test.ru/index.php?option=com_xmap&amp;view=xml&amp;id=3&amp;lang=de</loc>" rel="nofollow" target="_blank" >http://www.test.ru/index.php?option=com_xmap&amp;view=xml&amp;id=3&amp;lang=de</loc></a>
 </sitemap>
 </sitemapindex>

Спасибо за внимание!

Bootstrap сетка из 5 столбцов. Как сделать 5 колонок в бутстрап?

Странно и не понятно почему все-таки в Bootstrap нет в комплекте сетки из 5 колонок. Но если это сильно нужно, то это можно решить.

Покажу как это сделать:

css код

.col-xs-15,
.col-sm-15,
.col-md-15,
.col-lg-15 {
    position: relative;
    min-height: 1px;
    padding-right: 10px;
    padding-left: 10px;
}


.col-xs-15 {
    width: 20%;
    float: left;
}

@media (min-width: 768px) {
    .col-sm-15 {
        width: 20%;
        float: left;
    }
}

@media (min-width: 992px) {
    .col-md-15 {
        width: 20%;
        float: left;
    }
}

@media (min-width: 1200px) {
    .col-lg-15 {
        width: 20%;
        float: left;
    }
}


И соответственно вот так использовать в верстке: col-..-15
<div class="col-md-15 col-xs-12 col-sm-15">
</div>


Всех с наступающим новым годом!

Правильно заказать свой сайт или интернет-магазин.

Для того чтобы получить желаемый результат, вам нужно провести небольшой анализ. Мы постараемся выделить для вас несколько важных моментов в заказе сайта…

1. Нужно хорошо подумать, что вы хотите получить. Ответить себе на вопросы «Зачем мне сайт? Какие цели должен выполнять сайт? Какой материал важен для потенциального посетителя? И будет ли ваша услуга или товар востребованными?», от ответа на эти первоначальные вопросы, будет зависеть структура и бюджет вашего будущего сайта.

  • Если вам нужно просто заявить о себе в интернете, подойдет сайт-визитка состоящий из 3-5 страниц. С подробным описанием услуг, ваших контактов, и преимуществ заказа данной услуги у вас.
  • Если вы решили продавать, вам нужен удобный и функциональный интернет-магазин, который в свою очередь будет отлично презентовать ваш товар в интернете и привлечет внимание новых покупателей к вашим товарам.
  • Если вы решили проверить востребованность услуги, или усилить эффективность рекламы определенной услуги или товара, или собрать данные о потенциальных клиентах на услугу или товар. Вам нужна целевая страница(Лендинг-пейдж).

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

2. Следующий шаг, изучите своих конкурентов, изучите их сайты. Выделите для себя важное, обращайте внимания на структуру и внешний вид(дизайн сайта). Анализируйсте сайт, поставив себя на место клиента, посетителя сайта, так у вас получится избежать ошибок конкурентов и набраться удачного опыта. Собственно из этих соображений не делайте в точности как конкуренты, больше анализируйте и продумывайте.

3. Обратите особое внимание на дизайн сайтов(всегда вспоминается, встречают по одежке, а провожают по уму). Есть ли у вас название? Если ли у вас логотип? Фирменный стиль? Сайт разрабатывается на их основе. Если у вас этого нет, то обязательно нужно будет заложить стоимость хотя бы для логотипа. Не заказывайте логотип «как у конкурентов». Нужно все это творчески переработать и сделать свое удачное решение.

4. Изучайте сайты смежных тематик, возможно там вы подчерпнете какую то идею. Фиксируйте удачные и не удачные решения, это поможет при разработке.

5. Наконец-то представим, что у нас есть некоторые наработки, мы изучили рынок, знаем что за сайт нам нужен и как он примерно должен выглядеть. Теперь нужно найти исполнителя и изучить вопрос цены на разработку сайта. Соберите информацию о веб-студиях, или возможно у вас найдутся знакомые разработчики. В любом случае проконсультируйтесь в каждой, изучите прайс-листы.

6. Во время консультаций спрашивайте что входит в разработку, иначе может случится так, что цена только на первый взгляд очень привлекательна, но по итогу вы заплатите большие деньги. Проще для заказывающего сайт, договорится о конечной сумме. Чтобы не платить отдельно за каждую услугу.(например: дизайн сайта, создание лого, разработка сайта, продвижение сайта, техническое обслуживание)

7. Так же спрашивайте что получите в итоге и как это будет работать. Старайтесь вникнуть во все ньюансы при создание вашего сайта.

8. Важно учесть опыт, наличие успешных проектов, наличие договора — в котором будут отражены сроки, стоимость работ и обязанности сторон.

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

10. Представим что вы нашли исполнителей, по устраивающей вас цене, возможно заключили договор. Но это еще не всё!

11. Вам нужно собрать все наработки, как графические так и текстовые. Обязательно рассказать все свои идеи разработчикам, которые у вас возникали при просмотре и анализе сайтов конкурентов. Передайте все собранные ссылки как на хорошие так и на плохие сайты.

12. Получив готовый сайт, не ленитесь тестировать, проверьте абсолютно всё, для того чтобы выявить недостатки, опять поставьте себя на место клиента и подумайте на сколько это удобно. Дайте задания разработчиками исправить проблемы.

13. Самое главное: когда сайт в работе — не останавливайтесь! Развивайте ресурс, наполняйте и обновляйте. Если вы решили увеличить прибыль и получить новых клиентов нужно работать с сайтом.
Закажите продвижение и сопровождение сайта.

Если вы выполните все эти условия вы поймете что заказать сайт далеко не просто, но вполне проще, если рядом с вами профессионалы в области веб-разработки. Для нас в «Eскадра» сделать хороший сайт — норма!

Woocommerce: Добавление кастомного поля в вариативный продукт

if(!function_exists('wc_custom_product_data_fields')){

    // Display Fields
    add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' );

    function woo_add_custom_general_fields() {
        global $woocommerce, $post;
        echo '<div class="options_group">';

        woocommerce_wp_text_input(
            array(
                'id'          => '_custom_field',
                'label'       => __( '_custom_field', 'woocommerce' ),
                'placeholder' => __( '', 'woocommerce' ),
                'class'       => 'wc_input_price short',
                'desc_tip'    => 'true',
                'description' => __( '_custom_field', 'woocommerce' ),
                //'type'              => 'number',
                'required' => 'required',
                'custom_attributes' => array()
            )
        );
        echo '</div>';
    }

    // Save Fields
    add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' );
    function woo_add_custom_general_fields_save( $post_id ){
        $woocommerce_text_lpreis = $_POST['_custom_field']; //number_format($_POST['_custom_field'],2,'.','');
        if( !empty( $woocommerce_text_lpreis ) ){
            update_post_meta($post_id, '_custom_field', esc_attr( $woocommerce_text_lpreis) );
        }
    }

}



add_action( 'woocommerce_product_after_variable_attributes', 'add_to_variations_metabox', 10, 3 );
add_action( 'woocommerce_save_product_variation', 'save_product_variation', 20, 2 );



function add_to_variations_metabox( $loop, $variation_data, $variation ){

    $custom = get_post_meta( $variation->ID, '_custom_field', true ); ?>

    <div class="variable_custom_field">
        <p class="form-row form-row-first">
            <label>_custom_field</label>
            <input type="text" name="variation_custom_data[<?php echo $loop; ?>]" value="<?php echo esc_attr( $custom ); ?>" />
        </p>
    </div>

    <?php

}


function save_product_variation( $variation_id, $i ){

    // save custom data
    if ( isset( $_POST['variation_custom_data'][$i] ) ) {
        // sanitize data in way that makes sense for your data type
        $custom_data = ( trim( $_POST['variation_custom_data'][$i]  ) === '' ) ? '' : $_POST['variation_custom_data'][$i];
        update_post_meta( $variation_id, '_custom_field', $custom_data );
    }

}

Экспорт в csv(xls) данных из http.get с их обработкой

Всем доброго времени суток, сегодня решил оставить заметку о том как экспортировать данные полученные $http.get запросом AngularJS

Что понадобится:
AngularJS
ng-Csv
ngSanitize
Ваш API

Кнопка, вызывает нужную функцию

<button class="btn btn-default"
 ng-csv="export(id)"
 filename="yourfilename.csv"
 csv-header="['firstname', 'lastname']"
 field-separator=","
 decimal-separator=".">
 exportbtn
</button>

Функция экспорта

$scope.export = function(id){
    var arr = dataService.getList(id).then(function(data){
        var $items = [];
        _.each(_.flatten(data.posts), function(item){
            var $item = {};
            $item.firstname = item.post_meta.firstname;
            $item.lastname = item.post_meta.lastname;

            $items.push($item);
        });
        return $items;
    }, function(){});
    return arr;
}

Сервис для получения данных
Не забудьте добавить имя сервиса в контроллер

app.service('dataService', function ($http, $q) {
    var service = {};
    service.getList = getList;

    function getList(id){
        var q = $q.defer();

        var req = {
            method: 'GET',
            url: '/wp-json/app/v2/YOURMETHODGET/' + id
        }

        $http(req)
            .success(function(data) {
                q.resolve(data);
            })
            .error(function(error){
                q.reject(error);
            })

        return q.promise;
    };

    return service;
});

Сортировка по двум кастомным полям WordPress. Sorting by two custom fields

Пример которого не хватило в документации вордпресс.
Остается только подставить значение YOU_POST_TYPE (post)
и двух полей _a_date, _a_id

<?php
   $query = new WP_Query(
        array(
            'post_type' => 'YOU_POST_TYPE', //post
            'post_status' => 'any',
            'posts_per_page'=>'100',
            'meta_query' => array(
                'relation' => 'AND',
                'date_webeskadra' => array(
                    'key' => '_a_date', //поле 1 дата
                    'type' => 'datetime'
                ),
                'id_webeskadra' => array(
                    'key' => '_a_id', //поле 2 decimal
                    'type' => 'numeric'
                ),
            ),
            'orderby' => array('date_webeskadra' => 'ASC', 'id_webeskadra' => 'ASC')
        )
    );
?>

Как использовать результат WP_Query?

<?php if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();

?>

Добавить поле в категории Woocommerce. Custom field Woocommerce

Добавление дополнительного поля в категории плагина woocommerce. Поле с визуальным редактором от WordPress.

<?php
add_action( 'product_cat_add_form_fields', 'taxonomy_add_meta_field', 10, 2 );
// A callback function to add a custom field to our "presenters" taxonomy
function taxonomy_add_meta_field($tag) {
    // Check for existing taxonomy meta for the term you're editing
    ?>
    <div class="form-field">
        <label for="term_meta[description_bottom]"><?php _e( 'Description after Products', 'project_wpml' ); ?></label>
        <textarea type="text" class="wp-editor-area" name="term_meta[description_bottom]" id="term_meta[description_bottom]" value=""></textarea>
        <p class="description"><?php _e( 'Enter a value for this field','project_wpml' ); ?></p>
    </div>
    <?php
}

add_action( 'product_cat_edit_form_fields', 'taxonomy_edit_meta_field', 10, 2 );
// Edit term page
function taxonomy_edit_meta_field($term) {
    // put the term ID into a variable
    $t_id = $term->term_id;

    // retrieve the existing value(s) for this meta field. This returns an array
    $term_meta = get_option( "taxonomy_$t_id" );
    $settings = array('textarea_name' =>  "term_meta[description_bottom]" );
    ?>

    <tr class="form-field">
        <th scope="row" valign="top"><label for="term_meta[description_bottom]"><?php _e( 'Description after Products', 'project_wpml' ); ?></label></th>
        <td>
            <?php wp_editor( $term_meta['description_bottom'],  'description_bottom', $settings ); ?>
            <!--<textarea name="term_meta[description_bottom]" id="term_meta[description_bottom]" value="<?php echo esc_attr( $term_meta['description_bottom'] ) ? esc_attr( $term_meta['description_bottom'] ) : ''; ?>"></textarea>-->
            <p class="description"><?php _e( 'Enter a value for this field','project_wpml' ); ?></p>
        </td>
    </tr>
    <?php
}

function save_taxonomy_custom_meta( $term_id ) {
    if ( isset( $_POST['term_meta'] ) ) {
        $t_id = $term_id;
        $term_meta = get_option( "taxonomy_$t_id" );
        $cat_keys = array_keys( $_POST['term_meta'] );
        foreach ( $cat_keys as $key ) {
            if ( isset ( $_POST['term_meta'][$key] ) ) {
                $term_meta[$key] = $_POST['term_meta'][$key];
            }
        }
        // Save the option array.
        update_option( "taxonomy_$t_id", $term_meta );
    }
}
add_action( 'edited_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
?>

Bootstrap grid psd для фотошопа, скачать bootstrap сетку

 

Bootstrap сетка для фотошопа в формате psd, ссылка для скачивания находится ниже.

Скачать в psd

With the new Bootstrap 3 grid you have gutter width and column width different from the ones in Bootstrap 2, and the container width includes two half gutter padding on the sides. Also, in each breakpoint, the columns have uneven width since they are set by percentages, and the width of the container doesn’t match perfectly with even width.
In the download above you can find the grid templates for the three main breakpoints of bootstrap 3 (1170px, 970px, 750px), plus two grids for mobile (480px, 320px), all with the default 30px gutter. Also included the retina versions.
On the mobile grids (480px, 320px) the minimum column size is col-xs-2, because col-xs-1 breaks the grid in the browser with a viewport of 320px.

Сообщение Whatsapp новому контакту с сайта

Не мало времени было потрачено, чтобы просто найти решение как написать сообщение на whatsapp номеру который не в контактах. Решение протестировано на смартфоне. Надеюсь поможет кому-нибудь и съэкономит время!

Простое решение: как отправить сообщение с сайта на whatsapp

   <a href="whatsapp://send?text=Привет!&phone=+4917636***787">Send message to new WhatsApp number</a>

Буду дополнять заметку по мере надобности. Если есть вопросы спрашивайте, обязательно помогу Вам!