Top News

Hạnh phúc như mây trên trời, thoáng qua để rồi tan biến. Anh không biết bao nhiêu lần hạnh phúc thoáng qua cuộc đời anh rồi. Còn lại bao nhiêu thời gian cho anh tìm được hạnh phúc, cuộc sống như đại dương nổi bao sóng gió, rồi có ai đến cùng anh vượt qua nữa chứ, hay vẫn riêng mình anh như vậy thôi. Anh cứ tưởng hạnh phúc trong tầm tay anh, và muôn ngàn yêu thương trong đôi mắt em, anh không nghĩ rằng mất em.
Gần 2 năm bơi với cái nghề thiết kế website wordpress này, phải công nhận làm web với wordpress sướng vồn :3. Nhưng bên cạnh chữ “Sướng” đó thì đôi lúc cũng gặp những tình huống dở khóc dở cười :v. Bài viết hôm nay mình xin được tóm tắt lại những tình huống mà mình đã gặp phải trong quá trình làm việc.

Tutorial Hướng dẫn tạo Custom Field Meta Boxes repeater có thể kéo thả vị trí cho wordpress.

Cập nhật phiên bản sử dụng class đã tối ưu hơn.
Class Ten_Cua_Ban
{
    public function __construct()
    {
        add_action('admin_init', array($this, 'add_meta_boxes'), 1);
        add_action('save_post', array($this, 'repeatable_meta_box_save'));
    }

    function add_meta_boxes()
    {
        add_meta_box('repeatable-fields', 'Audio Playlist', array($this, 'repeatable_meta_box_display'), 'product', 'normal', 'high');
    }

    function repeatable_meta_box_display()
    {
        global $post;
        $repeatable_fields = get_post_meta($post->ID, 'repeatable_fields', true);
        wp_nonce_field('repeatable_meta_box_nonce', 'repeatable_meta_box_nonce');
        ?>
        <script type="text/javascript">
            jQuery(document).ready(function ($) {
                $('#repeatable-fieldset-one a.sort span').css('cursor', 'move');
                $('.metabox_submit').click(function (e) {
                    e.preventDefault();
                    $('#publish').click();
                });
                $('#add-row').on('click', function () {
                    var row = $('.empty-row.screen-reader-text').clone(true);
                    row.removeClass('empty-row screen-reader-text');
                    row.insertBefore('#repeatable-fieldset-one tbody>tr:last');
                    return false;
                });
                $('.remove-row').on('click', function () {
                    $(this).parents('tr').remove();
                    return false;
                });
                $('#repeatable-fieldset-one tbody').sortable({
                    opacity: 0.6,
                    revert: true,
                    cursor: 'move',
                    handle: '.sort'
                });
            });
        </script>

        <table id="repeatable-fieldset-one" width="100%">
            <thead>
            <tr>
                <th width="2%"></th>
                <th width="30%">Name</th>
                <th width="60%">URL</th>
                <th width="2%"></th>
            </tr>
            </thead>
            <tbody>
            <?php
            if ($repeatable_fields) :
                foreach ($repeatable_fields as $field) {
                    ?>
                    <tr>
                        <td><a class="sort"><span class="dashicons dashicons-menu"></span></a></td>
                        <td><input type="text" class="widefat" name="name[]"
                                   value="<?php if ($field['name'] != '') echo esc_attr($field['name']); ?>"/></td>

                        <td><input type="text" class="widefat" name="url[]"
                                   value="<?php if ($field['url'] != '') echo esc_attr($field['url']); else echo 'http://'; ?>"/>
                        </td>
                        <td><a class="button remove-row" href="#">-</a></td>

                    </tr>
                    <?php
                }
            else :
                // show a blank one
                ?>
                <tr>
                    <td><a class="sort"><span class="dashicons dashicons-menu"></span></a></td>
                    <td><input type="text" class="widefat" name="name[]"/></td>


                    <td><input type="text" class="widefat" name="url[]" value="http://"/></td>
                    <td><a class="button remove-row" href="#">-</a></td>

                </tr>
            <?php endif; ?>

            <!-- empty hidden one for jQuery -->
            <tr class="empty-row screen-reader-text">
                <td><a class="sort"><span class="dashicons dashicons-menu"></span></a></td>
                <td><input type="text" class="widefat" name="name[]"/></td>


                <td><input type="text" class="widefat" name="url[]" value="http://"/></td>
                <td><a class="button remove-row" href="#">-</a></td>

            </tr>
            </tbody>
        </table>

        <p><a id="add-row" class="button" href="#">Add another</a>
            <input type="submit" class="metabox_submit" value="Save"/>
        </p>

        <?php
    }

    function repeatable_meta_box_save($post_id)
    {
        if (!isset($_POST['repeatable_meta_box_nonce']) ||
            !wp_verify_nonce($_POST['repeatable_meta_box_nonce'], 'repeatable_meta_box_nonce'))
            return;
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
            return;
        if (!current_user_can('edit_post', $post_id))
            return;
        $old = get_post_meta($post_id, 'repeatable_fields', true);
        $new = array();
        $names = $_POST['name'];
        $urls = $_POST['url'];
        $count = count($names);
        for ($i = 0; $i < $count; $i++) {
            if ($names[$i] != '') :
                $new[$i]['name'] = stripslashes(strip_tags($names[$i]));
                if ($urls[$i] == 'http://')
                    $new[$i]['url'] = '';
                else
                    $new[$i]['url'] = stripslashes($urls[$i]); // and however you want to sanitize
            endif;
        }
        if (!empty($new) && $new != $old)
            update_post_meta($post_id, 'repeatable_fields', $new);
        elseif (empty($new) && $old)
            delete_post_meta($post_id, 'repeatable_fields', $old);
    }
}
Phiên bản cũ sử dụng function
add_action('admin_init', 'add_meta_boxes', 1);
        function add_meta_boxes()
        {
            add_meta_box('repeatable-fields', 'Audio Playlist', 'repeatable_meta_box_display', 'post', 'normal', 'high');
        }

        function repeatable_meta_box_display()
        {
            global $post;
            $repeatable_fields = get_post_meta($post->ID, 'repeatable_fields', true);
            wp_nonce_field('repeatable_meta_box_nonce', 'repeatable_meta_box_nonce');
            ?>
            <script type="text/javascript">
                jQuery(document).ready(function ($) {
                    $('.metabox_submit').click(function (e) {
                        e.preventDefault();
                        $('#publish').click();
                    });
                    $('#add-row').on('click', function () {
                        var row = $('.empty-row.screen-reader-text').clone(true);
                        row.removeClass('empty-row screen-reader-text');
                        row.insertBefore('#repeatable-fieldset-one tbody>tr:last');
                        return false;
                    });
                    $('.remove-row').on('click', function () {
                        $(this).parents('tr').remove();
                        return false;
                    });
                    $('#repeatable-fieldset-one tbody').sortable({
                        opacity: 0.6,
                        revert: true,
                        cursor: 'move',
                        handle: '.sort'
                    });
                });
            </script>

            <table id="repeatable-fieldset-one" width="100%">
                <thead>
                <tr>
                    <th width="2%"></th>
                    <th width="30%">Name</th>
                    <th width="60%">URL</th>
                    <th width="2%"></th>
                </tr>
                </thead>
                <tbody>
                <?php
                if ($repeatable_fields) :
                    foreach ($repeatable_fields as $field) {
                        ?>
                        <tr>
                            <td><a class="button remove-row" href="#">-</a></td>
                            <td><input type="text" class="widefat" name="name[]"
                                       value="<?php if ($field['name'] != '') echo esc_attr($field['name']); ?>"/></td>

                            <td><input type="text" class="widefat" name="url[]"
                                       value="<?php if ($field['url'] != '') echo esc_attr($field['url']); else echo 'http://'; ?>"/>
                            </td>
                            <td><a class="sort">|||</a></td>

                        </tr>
                        <?php
                    }
                else :
                    // show a blank one
                    ?>
                    <tr>
                        <td><a class="button remove-row" href="#">-</a></td>
                        <td><input type="text" class="widefat" name="name[]"/></td>


                        <td><input type="text" class="widefat" name="url[]" value="http://"/></td>
                        <td><a class="sort">|||</a></td>

                    </tr>
                <?php endif; ?>

                <!-- empty hidden one for jQuery -->
                <tr class="empty-row screen-reader-text">
                    <td><a class="button remove-row" href="#">-</a></td>
                    <td><input type="text" class="widefat" name="name[]"/></td>


                    <td><input type="text" class="widefat" name="url[]" value="http://"/></td>
                    <td><a class="sort">|||</a></td>

                </tr>
                </tbody>
            </table>

            <p><a id="add-row" class="button" href="#">Add another</a>
                <input type="submit" class="metabox_submit" value="Save"/>
            </p>

            <?php
        }

        add_action('save_post', 'repeatable_meta_box_save');
        function repeatable_meta_box_save($post_id)
        {
            if (!isset($_POST['repeatable_meta_box_nonce']) ||
                !wp_verify_nonce($_POST['repeatable_meta_box_nonce'], 'repeatable_meta_box_nonce'))
                return;
            if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
                return;
            if (!current_user_can('edit_post', $post_id))
                return;
            $old = get_post_meta($post_id, 'repeatable_fields', true);
            $new = array();
            $names = $_POST['name'];
            $urls = $_POST['url'];
            $count = count($names);
            for ($i = 0; $i < $count; $i++) {
                if ($names[$i] != '') :
                    $new[$i]['name'] = stripslashes(strip_tags($names[$i]));
                    if ($urls[$i] == 'http://')
                        $new[$i]['url'] = '';
                    else
                        $new[$i]['url'] = stripslashes($urls[$i]); // and however you want to sanitize
                endif;
            }
            if (!empty($new) && $new != $old)
                update_post_meta($post_id, 'repeatable_fields', $new);
            elseif (empty($new) && $old)
                delete_post_meta($post_id, 'repeatable_fields', $old);
        }


Bạn muốn phim có phụ đề?
Bạn muốn phim hiển thị 2 phụ đề cùng 1 lúc để học? (VD: Anh - Việt)
Bạn muốn phim hỗ trợ phụ đề nhiều ngôn ngữ?
Bạn muốn tất cả...

[Làm phụ đề]

1. Đầu tiên các bạn tải file python 27 ở đây
https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi

2. Bạn tải thư mục ffmpeg (20170422) ở đây (nhớ chọn 32 hay 64 bit phù hợp)
https://ffmpeg.zeranoe.com/builds/

3. Tải về rồi giải nén ffmpeg như trong video

4. Chuột phải My Computer -> Properties-> Advanced System Settings -> Advanced-> Environments Variables -> Paths ở System variables -> Edit
điền như trong video nhé, chú ý dấu ; nếu là win 7

5. Chạy lệnh pip install autosub như trong video
Video ở link source cuối bài viết

6. Tải cái file này về, lưu như trong video:
https://drive.google.com/file/d/0B7YWe--ksty0Wnkxbk9pcm5xSHM/view

7. Làm như video bước tiếp theo
Với win 7 khi mở cmd trong thư mục Scripts thì giữ Shift + chuột phải chọn Open command...

8. Với video tiếng gốc là tiếng Anh thì chạy lệnh 
autosub_app.py "tên video" 
rồi phụ đề sẽ tự lưu trong cùng thư mục
- Với video tiếng khác thì gõ autosub_app.py --list-languages, xem hỗ trợ những thứ tiếng gì, thấy từ viết tắt của nó rồi gõ như sau
VD: autosub_app.py "tên video" -S vi -D vi (nếu video gốc tiếng Việt)

[Dịch phụ đề + hiển thị phụ đề]

Lưu ý: nên dùng VLC hoặc KMPlayer hoặc phần mềm trình chiếu video khác để chèn phụ đề, đừng dùng Windows Media Player
VLC - 64bit : http://filehippo.com/download_vlc_media_player/download/40d25143ef488a8e0aa63d2eeb0e763e/
VLC - 32bit: http://filehippo.com/download_vlc_media_player/download/1b81e46bcb603909d3d0a5a35fa7ce7a/
Các bạn làm như video và tải 2 phần mềm này về
Dịch phụ đề
https://github.com/SubtitleEdit/subtitleedit/releases/download/3.5.2/SubtitleEdit-3.5.2-Setup.zip#64v2y2y243q2u284c4z2x294v284y2v2
Hiển thị nhiều phụ đề
https://www.videohelp.com/download/SubSplicer-11.zip

Huong dan dich phu de va hien thi phu de video

Source: Facebook