Hướng dẫn cày thẻ RAID Boss Pokémon GO

Tóm tắt nhanh

Tạo tài khoản phụ, nhập mã giới thiệu của tài khoản chính, train lên level 5 và đánh thắng 3 RAID Boss thì tài khoản chính sẽ nhận được 1 thẻ RAID xanh.

Giới thiệu

Như anh em đã biết, muốn có 1 boss hundo hay thậm chí là shundo thì phụ thuộc vào may mắn và phần nhiều nhờ vào kiên trì hoặc chịu chơi chịu chi đối với VNĐ thần chưởng mua thẻ RAID cày boss. Nếu bạn là một game thủ chơi game vui không muốn mất tiền vào game trong thời kỳ dịch giã như thế này thì sau đây là cách để bạn có thể nhận được thẻ RAID miễn phí không giới hạn (tùy thuộc vào sự nhẫn nại và kiên trì của bạn, trung bình từ 5 – 20 thẻ/ngày)

Các thức thực hiện

Bước vào chủ đề chính luôn, để có thể nhận thẻ RAID Boss free thì mỗi ngày chỉ cần vào GYM Boss là tự động nhận được, hoặc vào GYM thường và quay thẻ GYM sẽ xuất hiện thẻ RAID free (màu cam, giới hạn 1 thẻ/ngày đối với khu vực bình thường, khu vực sự kiển có thể nhận 2 thẻ/ngày. Khu vực nào thì tùy theo thời điểm có sự kiện được thông báo từ Ni nha các bạn)

Muốn nhận thêm thẻ RAID Boss miễn phí thì hiện tại chỉ có thể cày từ sự kiện giới thiệu người chơi mới hoặc người chơi trở lại. Khi acc clone đánh thắng RAID Boss 3 lần thì bạn có thể nhận được 1 thẻ RAID xanh làm phần thưởng. Lưu ý là danh sách bạn bè của bạn không được quá đầy, phải xác nhận bạn bè trước khi acc clone đánh RAID boss và acc clone không được sử dụng tài khoản Niantic Kids

Bước 1: Mở trainer profile lên, mở danh sách bạn bè trong tab Friends

Bước 2: Nhấn nút Invite rồi nhấn chọn Copy Referral Code để sao chép mã giới thiệu

Lưu ý: người chơi trở lại khi offline trong vòng 90 ngày được xem là hợp lệ, người được giới thiệu phải nhập code giới thiệu của bạn trong vòng 72 giờ sau khi đăng nhập.

Bước 3: Đăng nhập vào tài khoản clone, nhấn chọn Have a Referral Code? để nhập mã giới thiệu ngay ở màn hình đăng nhập lần đầu tiên, hoặc có thể nhập trong vòng 72 giờ sau khi đăng nhập trong danh sách bạn bè ở tab Invite.

Tạo nhanh tài khoản Pokémon Trainer Club và chiến thôi.

Để có thể cày được càng nhiều thẻ RAID free thì bạn phải tạo nhiều tài khoản Pokémon Trainer Club để đăng nhập, lên level 5 và đánh thắng 3 RAID Boss, để tạo tài khoản nhanh và thuận lợi thì bạn hãy sử dụng email tạm để đăng ký cho nhanh rồi bỏ ngay sau khi đăng ký tại đây: https://mailtamthoi.net/ hoặc https://temp-mail.org/vi/

Bước 1: Truy cập vào https://mailtamthoi.net/ để tạo 1 tài khoản email tạm, nên đăng ký 1 lần 20 30 mail luôn để đăng ký nhiều tài khoản Pokémon Trainer Club cho nhanh.

Bước 2: Truy cập vào https://club.pokemon.com/us/pokemon-trainer-club/sign-up/ để đăng ký tài khoản Pokémon Trainer Club bằng email tạm vừa đăng ký.

Bước 3: Đăng nhập và nhập mã giới thiệu.

Bước 4: Xác nhận bạn bè từ acc chính, nếu không sẽ không nhận được thẻ phần thưởng

Bước 5: Train acc clone lên level 5, đánh 3 RAID và mở acc chính lên nhận thẻ trong thông tin bạn bè của acc clone.

Posted in Linh tinh

Hướng dẫn cài đặt và cấu hình iPogo

1. Cài đặt iPogo

+ Trên máy tính: Truy cập vào website: https://ipogo.app tải file IPA về rồi dùng sideloadly import vào là được
+ Trên điện thoại: tùy thời điểm có thể cài được hay không nhé.

Key VIP free dùng thử 3 ngày trước khi quyết định có mua VIP hay không:

6378-cb94-42f7-4257-8461-053e-3bee-0183

Giữa bản VIP và bản free cũng có những chức năng khác biệt rõ rệt :’)

2. Cấu hình cơ bản

Chức năng thường

  • AUTOWALK (TỰ ĐỘNG DI CHUYỂN – Để tự động di chuyển, giữ ngón tay trên bản đồ khoảng 2 giây sẽ xuất hiện 1 danh sách lệnh, nhận chọn Auto Walk. Có một cách khách là dùng chức năng Random Route, chọn số lượng Pokestop sẽ đi, nó sẽ tự động di chuyển theo các Pokestop. Còn một cách khác là sử dụng GPX route sẽ giải thích ở phần sau. Nhớ là tốc độ ấp trứng là 9 – 10km, sử dụng Go Plus là 3 – 6km)
  • TELEPORT (DỊCH CHUYỂN ĐẾN MỘT TỌA ĐỘ CHỈ ĐỊNH – Để có thể dịch chuyển, giữ ngón tay trên bản đồ khoảng 2 giây sẽ xuất hiện 1 danh sách lệnh, nhấn chọn Teleport. Nếu muốn dịch chuyển tới tọa độ có sẵn, hãy mở menu và chọn Snipe. Có thể lưu các tọa độ yêu thích vào danh sách Favorites để dễ di chuyển hơn sau này. Một cách đơn giản hơn nữa là dùng chức năng Feed để tìm Pokemon và nhấn vào Pokemon rồi chọn Teleport. Đừng quên thời gian cooldown trong mỗi lần dịch chuyển)
  • FAVORITES (TỌA ĐỘ YÊU THÍCH – Có 3 tùy chọn: Hotspot là các nơi xuất hiện nhiều Pokemon nhất trên thế giới, Favorites là các tọa độ bạn tự thêm vào và Route là các đường đi được cài đặt trên bản đồ)
  • FEEDS (TÌM KIẾM – Có 4 tùy chọn: Pokémon, Raid, Nest, và Quest. Dùng để tìm kiếm Pokemon, Raid boss, ổ Pokemon và Nhiệm vụ theo yêu cầu được cho phép)
  • IMPORT/EXPORT SETTINGS (NHẬP XUẤT CÀI ĐẶT – Lưu trữ thông tin cấu hình cài đặt của bạn lại để tiện cho việc phục hồi sau này nếu có cài lại hoặc chia sẽ cho người khác)
  • ENHANCED THROW (TĂNG CƯỜNG HỖ TRỢ QUĂNG BÓNG – Hỗ trợ quăng bóng xoáy, AR+, và Excellent, Greet, Nice…)
  • STATS INVENTORY (CHỈ SỐ POKEMON – Hiển thị tất cả chỉ số của Pokemon trong túi, có thể gây crash game mọi lúc. Chỉ nên mở lúc cần dọn dẹp hoặc xóa Pokemon)
  • NEARBY SHORTCUT HIDE/SHOW (HIỂN THỊ POKEMON LÂN CẬN – Màn hình hiển thị các Pokemon lân cận)
  • NEARBY AUTOWALK/TELEPORT (TỰ DI CHUYỂN HOẶC DỊCH CHUYỂN – Cho phép tự di chuyển hoặc dịch chuyển ngay lập tức đến Pokemon, Pokestop gần đó)
  • SPOOFING (GIẢ MẠO ĐỊA ĐIỂM – Có thể tắt đi nếu muốn làm bộ binh, mở lên sẽ lưu lại tọa độ cuối cùng của bạn mà không bị dịch chuyển về địa điểm thật)
  • MENU BUTTON HIDE/SHOW (TẮT MỞ NÚT MENU – Tắt đi để màn hình giống như không hack, nhấn 2 ngón tay khoảng 2 giây để mở lại)
  • JOYSTICK DYNAMIC/STATIC (CẦN GẠT ĐIỀU KHIỂN – Mặc định là cần gạt điều khiển di động theo vị trí bạn đặt ngón tay, nếu bật Static thì cần gạt điều sẽ hiển thị cố định trên màn hình)
  • COOLDOWN WARNINGS OFF/ON (CẢNH BÁO THỜI GIAN KHÓA – Hiển thị thời gian tạm khóa không được thực hiện hành động tiếp theo)

Chức năng VIP

  • GO PLUS (GIẢ LẬP THIẾT BỊ GO PLUS – Cần mở Bluetooth và vào cài đặt, kéo xuống Pokemon Go Plus, chọn thiết bị Go Plus khả dụng, mở tất cả tùy chọn Nearby Pokemon, Nearby Pokestop. Lưu ý Go Plus sẽ ưu tiên bắt Pokemon hơn là quay Pokestop thậm chí hết bóng đỏ đi nữa. Một lưu ý nữa là auto chỉ dùng bóng đỏ thôi nhé và chỉ quăng bóng thôi, không xoáy bóng và dùng berry, miss bóng cũng rất nhiều T_T )
  • ONE CLICK DELETE (XÓA BẰNG 1 CLICK – Xóa vật phẩm theo cài đặt ban đầu.)
  • FAST CATCH (BẮT NHANH POKEMON – Bỏ qua hiệu ứng chuyển động để bắt Pokemon nhanh hơn)
  • LIVE FEED OVERLAY (XEM POKEMON THỜI GIAN THỰC – Hiển thị một màn hình theo dõi nhỏ các Pokemon trong cài đặt của bạn, nhấn vào Pokemon sẽ lập tức dịch chuyển đến vị trí Pokemon đó)
  • FASTER MAP LOAD (TẢI BẢN ĐỒ NHANH – Giảm thời gian tải hiển thị các Pokemon xuất hiện trên bản đồ)
  • BLOCK NON SHINIES/BNS INCLUDE 100IV (Ngăn chặn vào màn hình bắt Pokemon khi nó không phải là Shiny. BNS Include 100IV cũng như vậy nhưng sẽ cho phép Pokemon có IV 100 được vào màn hình bắt, để có thể hoạt động chính xác thì 2 tùy chọn này phải bật cùng lúc)
  • AUTO TRANSFER POKEMON ON CATCH (TỰ ĐỘNG XÓA POKEMON SAU KHI BẮT – Tự động transfer tất cả Pokemon khi bắt không bao gồm Shiny, Trang phục, 0IV, trên 90IV, Unown và Lake Trio [Azelf, Uxie, và Mesprit]. Chức năng này chỉ hoạt động khi để màn hình mở, không hoạt động khi chạy nền)
  • INSTANT TEAM ROCKET (ONE HIT – Ngay lập tức chiến thắng Team Rocket)
  • INSTANT TRAINING (Ngay lập tức chiến thắng trận chiến tập huấn)
  • SPAWN BOOSTER (TĂNG CƯỜNG XUẤT HIỆN – Pokemon xuất hiện tầm xa hơn và ngay lập tức)

Mặc định khuyên bạn nên bật tất cả chức năng VIP (đã là chức năng VIP thì cái nào cũng ngon) trừ 3 cái này ra nên suy nghĩ kỹ trước khi bật: Release on Catch, Block Non Shinies và BNS include 100iv.

Thời gian COOLDOWN

Thời gian COOLDOWN là khoảng thời gian bạn cần đợi sau khi thực hiện một hành động trong trò chơi. Điều này được tính từ khoảng cách bạn sẽ di chuyển giữa các hành động trong trò chơi của mình. Sau đó, bạn sẽ cần phải đợi thời gian COOLDOWN đã nói để sử dụng hành động trong trò chơi tiếp theo của mình nếu không bạn sẽ thất bại với hành động đã nói.

Một số ví dụ sẽ là Pokémon tiếp theo mà bạn cố gắng bắt sẽ bỏ chạy, Raid boss sẽ không hoạt động và Pokéstop sẽ không mang lại phần thưởng cho bạn. Nếu bạn đã thực hiện một hành động trước khi dịch chuyển trong vòng 2 giờ qua, bạn sẽ cần tính Thời gian COOLDOWN của mình. Nếu bạn không sử dụng một hành động nào trong 2 giờ trước khi dịch chuyển, thì bạn không cần tính Thời gian COOLDOWN của mình. Có thể giả sử rằng khi dịch chuyển khoảng cách xa, bạn sẽ cần đợi thời gian Thời gian COOLDOWN tối đa là 2 giờ.

Nói tóm lại là nếu thực hiện một hành động kích hoạt thời gian COOLDOWN thì phải tuân thủ quy tắc về thời gian và khoảng cách một cách nghiêm ngặt để tránh bị phạt từ phía Niantic.

Khoảng cáchThời gian Cooldown
1 km30 giây
5 km2 phút
10 km6 phút
25 km11 phút
30 km14 phút
65 km22 phút
81 km25 phút
100 km35 phút
250 km45 phút
500 km1 giờ
750 km1 giờ 20 phút
1000 km1 giờ 30 phút
> 1500 km2 giờ

Các hoạt động kích hoạt thời gian COOLDOWN

  • Bắt Pokemon (ngoại trừ Pokemon xuất hiện từ Incense, Lure Modules, Special Lures và Meltan’s Mystery Box
  • Tình cờ làm rơi quả bóng trên màn hình bắt Pokemon (kể cả bắt boss raid)
  • Cho Pokemon hoang dã ăn (kể cả Pokemon trong GYM)
  • Quay Pokestop (đặc biệt là khi nhận được thông báo túi đầy do giới hạn vật phẩm)
  • Quay một Pokéstop với thông báo Thử lại do giới hạn số lần quay
  • Đặt 1 Pokemon vào GYM
  • Cho ăn một Pokemon thủ GYM trong radar màn hình (đặc biệt là cho ăn từ xa miễn là bạn ở trong màn hình radar)
  • Chiến đấu với GYM
  • Pokemon chạy trốn (thông qua giới hạn bắt)
  • Sử dụng thiết bị Pokemon Go Plus để bắt hoặc quay Pokestop

Lưu ý: Những hành động này sẽ KHÔNG đặt lại hoặc kích hoạt thời gian COOLDOWN khác nếu bạn đã đang trong thời gian COOLDOWN.

Các hoạt động không kích hoạt thời gian COOLDOWN

  • Dịch chuyển
  • Bắt gặp 1 Pokemon hoang dã
  • Cho Pokemon thủ GYM ăn từ khoảng cách xa
  • Tự động di chuyển
  • Ấp trứng
  • Nhận thưởng nhiệm vụ và phần thưởng hàng tuần
  • Bắt Pokemon phần thưởng từ nhiệm vụ
  • Raid boss nhanh (đảm bảo bạn đã hết hời gian COOLDOWN trước đó 2 giờ)
  • Tặng quà và mở quà
  • Tiến hóa Pokemon
  • Tăng cấp Pokemon
  • Trao đổi Pokemon
  • Xóa Pokemon
  • Chụp hình Pokemon
  • Thay đổi Pokemon buddy
  • Nhận kẹo buddy
  • Sử dụng các vật phẩm (hồi máu, tiến hóa, TM) trên Pokemon
  • Tăng cấp kỹ năng thứ 3 cho Pokemon
  • Sử dụng thính, trứng hoặc Starpiece
  • Xóa vật phẩm bất kỳ
  • Chiến đấu với người chơi khác (PVP)
  • Chiến đấu với team leader (Blanche, Candela hoặc Spark)
  • Đặt thính lên Pokestop
  • Mua sắm vật phẩm trong shop
  • Thay đổi quần áo, trang phục
  • Chuyển Pokemon sang Pokemon Home
  • Nhận thẻ raid miễn phí bằn cách nhấp vào GYM khi raid đang hoạt động (không bao gồm nhận thẻ bằng cách quay thẻ GYM)
  • Bắt Pokemon nhất định từ Photobombs như Smeargle hay Party Hat Pikachu
  • Làm rơi một quả bóng xuống đất (có lẽ bạn đã ở trạng thái COOLDOWN)

Săn Pokemon từ xa

Săn bắt Pokemon từ xa là cách “dịch chuyển tức thời và bắt Pokemon” ở nơi cách xa vị trí thực của bạn hiện tại. Để săn bắt Pokemon, chỉ cần nhập tọa độ vào Snipe và dịch chuyển tới vị trí của Pokemon xuất hiện và bắt nó. Tuy nhiên có rất nhiều luật lệ xung quanh cách thức này mà bạn phải tôn trọng để không bị khóa tài khoản vĩnh viễn.

Trên hết, bạn sẽ cần phải tôn trọng bộ đếm thời gian, tùy thuộc vào mức độ bạn muốn dịch chuyển và tương tác với trò chơi; điều này được gọi là “thời gian COOLDOWN” (giải thích ngay bên trên). Bạn cũng có thể “giam” một Pokemon nếu bạn không muốn bỏ lỡ nó (cũng được giải thích bên dưới).

Giam giữ Pokemon

Cách thức “Giam giữ Pokemon” được sử dụng để mô tả tình huống khi bạn bắt gặp Pokemon mà không ném bóng hoặc cho ăn Pokemon cho đến khi bạn có thể bắt được nó và điều đó phụ thuộc vào khoảng cách và lượng thời gian kể từ hành động cuối cùng của bạn. Bạn CẦN tôn trọng thời gian COOLDOWN nếu không Pokemon sẽ bỏ chạy. Nếu bạn không biết thời gian COOLDOWN là gì, hãy kiểm tra câu hỏi ở trên!

Raid boss thần tốc

Bạn có thể thực hiện liên tục bao nhiêu cuộc Raid boss tùy thích mà không sợ sẽ kích hoạt thời gian COOLDOWN. Bạn cần phải hết thời gian COOLDOWN trước đó và bạn không được ném berry hoặc bóng để bắt boss sau trận chiến. Bạn phải nhấn Run để thoát và chuyển sang Raid boss tiếp theo ở bất kỳ. Mục đích của các cuộc đột kích tốc độ thường là để tìm một đầu Pokemon IV 100 hoặc Shiny. Tuy nhiên sẽ khá tốn thẻ raid cho hoạt động này 🙂

Posted in Lập trình web

Script sao lưu tất cả database

#!/bin/bash

USER="test_user"
PASSWORD="test_password"
#OUTPUT="/Users/jangkeyte/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`

for db in $databases; do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
       # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
    fi
done

Để tối ưu script trên, có thể bổ sung thêm đoạn sau để loại bỏ hàm if

ExcludeDatabases="Database|information_schema|performance_schema|mysql"

tại dòng databases=’…’ thay Database bằng $ExcludeDatabases

databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v $ExcludeDatabases`

Bỏ điều kiện if và fi

for db in $databases; do
    echo "Dumping database: $db"
    mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
    # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
done

Posted in Kinh nghiệm

Đăng nhập laravel 8

Bước 1:

composer require laravel/ui

Bước 2:

php artisan ui vue --auth

Bước 3:

npm install

Bước 4:

npm run dev

Bước 5:

Tắt chức năng đăng ký

Auth::routes(['register' => false]);

Kiểm tra đăng nhập trong route

Route::get('dashboard', 'App\Http\Controllers\UserController@dashboard')->middleware('auth');

Kiểm tra đăng nhập trong controller

<?php

class UserController extends Controller
{
	public function __construct()
	{
	    $this->middleware('auth');
	}

	public function dashboard(){
		//
	}

	...

}

Kiểm tra trực tiếp trong view hoặc bất kỳ nơi nào khác

if(auth()->check()){
  // If the user only authenticated
}

Lấy thông tin người dùng

$user = auth()->user();

Theo mặc định laravel sẽ kiểm tra email, muốn thay đổi thành kiểm tra tên đăng nhập thì thêm phương thức sau vào login controller

// app/Http/Controllers/Auth/LoginController.php

public function username()
{
    return 'username';
}
Posted in Laravel 8.x

Khai báo biến toàn cục mặc định WordPress

Hàm tạo biến toàn cục trong option

function jangkeyte_defaults() {
    $jk_options = array(
      // Main
      'color_primary' => '#da222b',
      'site_width' => '1080px',

      // Logo
      'site_logo' => get_template_directory_uri().'/logo.png',
      'site_logo_slogan' => 'Jang Keyte WordPress site',
      'favicon' => get_template_directory_uri().'/favicon.png',
      'google_map_api' => '',
      'logo_position' => 'left',

      // Follow icons
      'follow_facebook' => 'https://facebook.com/jangkeyte',
      'follow_twitter' => 'https://twitter.com/jangkeyte',
      'follow_instagram' => 'https://instagram.com/jangkeyte',
      'follow_google' => 'https://google.com/jangkeyte',

      // Header
      'site_title' => 'JANG KEYTE',

      // Footer
      'footer_bottom_align' => 'center',
      'footer_left_text' => 'Copyright [ux_current_year] &copy; <strong>Kha Thiết Giang</strong>',
      'back_to_top' => true,
      
      // Contact
      'contact_phone' => '',
      'contact_email' => 'jangkeyte@gmail.com',
    );

    // Return default option if not empty
    return $jk_options;
};

add_option('jk_default', jangkeyte_defaults());

Sử dụng trong theme

echo get_option( 'jk_default' )['site_logo'];

Posted in Kinh nghiệm, Lập trình web, Themes, Wordpress

Định dạng chữ nằm giữa

CSS


<style>
.title {
   text-align: center;
   display: flex;
   justify-content: center;
   align-items: center;
   height: 44px;
}
</style>

HTML

<h3 class="title>Tiêu đề</h3>
Posted in Kinh nghiệm, Lập trình web

Tạo nút liên hệ hiệu ứng gom 1 chỗ

HTML

<div class="fab-wrapper">
   <input id="fabCheckbox" type="checkbox" class="fab-checkbox">
   <label class="fab" for="fabCheckbox">
      <i class="icon-cps-fab-menu"></i>
      <!-- <i class="icon-cps-close"></i> -->
   </label>
   <div class="fab-wheel">
      <a class="fab-action fab-action-1" href="https://levantoan.com/san-pham/" rel="nofollow" target="_blank">
         <span class="fab-title">Tìm cửa hàng</span>
         <div class="fab-button fab-button-1"><i class="icon-cps-local"></i></div>
      </a>
      <a class="fab-action fab-action-2" href="tel:0965419096" rel="nofollow">
         <span class="fab-title">Gọi trực tiếp</span>
         <div class="fab-button fab-button-2"><i class="icon-cps-phone"></i></div>
      </a>
      <a class="fab-action fab-action-3" onclick="Tawk_API.showWidget();Tawk_API.maximize();" rel="nofollow">
         <span class="fab-title">Chat ngay</span>
         <div class="fab-button fab-button-3"><i class="icon-cps-chat"></i></div>
      </a>
      <a class="fab-action fab-action-4" href="https://zalo.me/0965419096" target="_blank" rel="nofollow">
         <span class="fab-title">Chat trên Zalo</span>
         <div class="fab-button fab-button-4"><i class="icon-cps-chat-zalo"></i></div>
      </a>
   </div>
   <div class="suggestions-chat-box hidden" style="display: none;">
      <div class="box-content d-flex justify-content-around align-items-center">
         <i class="fa fa-times-circle" aria-hidden="true" id="btnClose" onclick="jQuery('.suggestions-chat-box').hide()"></i>
         <p class="mb-0 font-14">Liên hệ ngay <i class="fa fa-hand-o-right" aria-hidden="true"></i></p>
      </div>
   </div>
   <div class="devvn_bg"></div>
</div>

CSS

<style>
   /*@media (min-width: 992px){
        .fab-wrapper{
            display: none !important;
        }
    }*/
 
   .fab-wrapper {
      position: fixed;
      bottom: 5px;
      right: 0;
      z-index: 9999999;
   }
   .fab-checkbox {
      display: none !important;
   }
   .fab-checkbox:checked~ .devvn_bg {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: rgba(0, 0, 0, 0.8);
      z-index: 1;
   }
   .fab {
      width: 60px;
      max-width: unset;
      height: 60px;
      display: flex !important;
      justify-content: center;
      align-items: center;
      margin: 0;
      border-radius: 50%;
      background: #d70018;
      box-shadow: 0 3px 6px rgb(0 0 0 / 16%), 0 3px 6px rgb(0 0 0 / 23%);
      position: absolute;
      right: 10px;
      bottom: 10px;
      z-index: 1000;
      overflow: hidden;
      transform: rotate(
            0deg
      );
      -webkit-transition: all .15s cubic-bezier(.15,.87,.45,1.23);
      transition: all .15s cubic-bezier(.15,.87,.45,1.23);
   }
   .fab-checkbox:checked~.fab {
      transform: rotate(
            90deg
      );
      -webkit-transition: all .15s cubic-bezier(.15,.87,.45,1.23);
      transition: all .15s cubic-bezier(.15,.87,.45,1.23);
   }
   [class*=icon-cps-] {
      display: inline-block;
      vertical-align: middle;
      background-image: url('https://live.staticflickr.com/65535/51045776517_c33189680e_o.png')!important;
      background-repeat: no-repeat;
      background-size: 453px;
   }
   .icon-cps-fab-menu {
      width: 50px;
      height: 50px;
      margin: 0 !important;
      background-size: 694px;
      background-position: -649px 0;
   }
   .fab-checkbox:checked~.fab .icon-cps-fab-menu {
      width: 30px;
      height: 30px;
      margin: 0;
      background-size: 615px;
      background-position: -291px -70px;
   }
   .fab-wheel {
      width: 300px;
      height: 220px;
      position: absolute;
      bottom: 15px;
      right: 15px;
      transform: scale(0);
      transform-origin: bottom right;
      transition: all .3s ease;
      z-index: 12;
   }
   .fab-checkbox:checked~.fab-wheel {
      transform: scale(1);
   }
   .fab-wheel .fab-action {
      display: flex;
      align-items: center;
      font-size: 14px;
      font-weight: 700;
      color: #fff;
      position: absolute;
      text-decoration: none;
   }
   .fab-wheel .fab-action-1 {
      top: 0;
      right: 0;
   }
   .fab-title {
      float: left;
      margin: 0 5px 0 0;
      opacity: 0;
   }
   .fab-checkbox:checked~.fab-wheel .fab-title {
      opacity: 1;
   }
   .fab-button {
      width: 45px;
      height: 45px;
      display: flex;
      justify-content: center;
      align-items: center;
      float: left;
      padding: 4px;
      border-radius: 50%;
      background: #0f1941;
      box-shadow: 0 1px 3px rgb(0 0 0 / 12%), 0 1px 2px rgb(0 0 0 / 24%);
      font-size: 24px;
      color: White;
      transition: all 1s ease;
      overflow: hidden;
   }
   .icon-cps-local {
      width: 28px;
      height: 28px;
      background-position: 0px -49px;
   }
   .fab-wheel .fab-button-1 {
      background: #dd5145;
   }
   .fab-wheel .fab-action-2 {
      top: 40px;
      left: 55px;
   }
 
   .fab-wheel .fab-button-2 {
      background: #fb0;
   }
   .icon-cps-phone {
      width: 28px;
      height: 28px;
      background-position: -51px -49px;
   }
   .fab-wheel .fab-action-3 {
      left: 50px;
      bottom: 70px;
   }
   .fab-wheel .fab-button-3 {
      background: #0f9d58;
   }
   .icon-cps-chat {
      width: 30px;
      height: 30px;
      background-position: -369px 0px;
   }
   .fab-wheel .fab-action-4 {
      left: 0;
      bottom: 0;
   }
   .fab-wheel .fab-button-4 {
      background: #2f82fc;
   }
   .icon-cps-chat-zalo {
      width: 30px;
      height: 30px;
      background-position: -362px -1px;
      background-size: 515px;
   }
   .suggestions-chat-box {
      min-width: 140px;
      min-height: 50px;
      display: flex;
      justify-content: center;
      align-items: center;
      border: 1px solid #1d72e0;
      border-radius: 10px;
      background: #277cea;
      box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 15%);
      font-size: 14px;
      font-weight: 700;
      color: #fff;
      position: fixed;
      right: 80px;
      bottom: 7%;
      z-index: 11;
   }
   .hidden {
      display: none!important;
   }
   .align-items-center {
      -ms-flex-align: center!important;
      align-items: center!important;
      -ms-flex-pack: distribute!important;
      justify-content: space-around!important;
      display: -ms-flexbox!important;
      display: flex!important;
      -webkit-box-align: center!important;
      -ms-flex-align: center!important;
      align-items: center!important;
   }
   .suggestions-chat-box #btnClose {
      position: absolute;
      top: 2px;
      left: 2px;
   }
   i.icon-cps-face {
      width: 28px;
      height: 28px;
      background-position: -177px 0px;
   }
   .fab-checkbox:not(:checked)~.fab {
      animation-name: zoom;
      -webkit-animation-name: zoom;
      animation-delay: 0s;
      -webkit-animation-delay: 0s;
      animation-duration: 1.5s;
      -webkit-animation-duration: 1.5s;
      animation-iteration-count: infinite;
      -webkit-animation-iteration-count: infinite;
      cursor: pointer;
      box-shadow: 0 0 0 0 #c31d1d;
   }
   @-webkit-keyframes tada {
      0% {
         -webkit-transform: scale(1);
         transform: scale(1)
      }
 
      10%,20% {
         -webkit-transform: scale(.9) rotate(-3deg);
         transform: scale(.9) rotate(-3deg)
      }
 
      30%,50%,70%,90% {
         -webkit-transform: scale(1.1) rotate(3deg);
         transform: scale(1.1) rotate(3deg)
      }
 
      40%,60%,80% {
         -webkit-transform: scale(1.1) rotate(-3deg);
         transform: scale(1.1) rotate(-3deg)
      }
 
      100% {
         -webkit-transform: scale(1) rotate(0);
         transform: scale(1) rotate(0)
      }
   }
 
   @keyframes tada {
      0% {
         -webkit-transform: scale(1);
         -ms-transform: scale(1);
         transform: scale(1)
      }
 
      10%,20% {
         -webkit-transform: scale(.9) rotate(-3deg);
         -ms-transform: scale(.9) rotate(-3deg);
         transform: scale(.9) rotate(-3deg)
      }
 
      30%,50%,70%,90% {
         -webkit-transform: scale(1.1) rotate(3deg);
         -ms-transform: scale(1.1) rotate(3deg);
         transform: scale(1.1) rotate(3deg)
      }
 
      40%,60%,80% {
         -webkit-transform: scale(1.1) rotate(-3deg);
         -ms-transform: scale(1.1) rotate(-3deg);
         transform: scale(1.1) rotate(-3deg)
      }
 
      100% {
         -webkit-transform: scale(1) rotate(0);
         -ms-transform: scale(1) rotate(0);
         transform: scale(1) rotate(0)
      }
   }
 
   @-webkit-keyframes zoom {
      0% {
         transform: scale(.9)
      }
 
      70% {
         transform: scale(1);
         box-shadow: 0 0 0 15px transparent
      }
 
      100% {
         transform: scale(.9);
         box-shadow: 0 0 0 0 transparent
      }
   }
 
   @keyframes zoom {
      0% {
         transform: scale(.9)
      }
 
      70% {
         transform: scale(1);
         box-shadow: 0 0 0 15px transparent
      }
 
      100% {
         transform: scale(.9);
         box-shadow: 0 0 0 0 transparent
      }
   }
</style>
Posted in Lập trình web

Tạo menu đa cấp đơn giản bằng CSS

HTML


<ul class="main-menu clearfix" >
  <li><a href="#" >Trang chủ</a> </li>
  <li>
    <a href="#" >Sản phẩm</a> 
    <ul class="sub-menu" >
      <li><a href="#" >Sản phẩm A</a> </li>
      <li>
           <a href="#" >Sản phẩm B</a> 
           <ul class="sub-menu" >
               <li><a href="#" >Sản phẩm B - 1</a> </li>
               <li><a href="#" >Sản phẩm B - 2</a> </li>
               <li><a href="#" >Sản phẩm B - 3</a> </li>
               <li><a href="#" >Sản phẩm B - 4</a> </li>
           </ul>
      </li>
      <li><a href="#" >Sản phẩm C</a> </li>
      <li><a href="#" >Sản phẩm D</a> </li>
    </ul>
  </li>
  <li>
    <a href="#" >Về chúng tôi</a> 
    <ul class="sub-menu" >
      <li><a href="#" >Lịch sử hình thành</a> </li>
      <li><a href="#" >Mục tiêu và sứ mệnh</a> </li>
      <li><a href="#" >Đối tác</a> </li>
    </ul>
  </li>
  <li><a href="#" >Chính sách</a> </li>
  <li><a href="#" >Liên hệ</a> </li>
</ul>

CSS

<style>
*, *:before, *:after {
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}
.clearfix:before,.clearfix:after{
	content: '';
	display: table;
	clear: both;
}
.main-menu{
	width: 1200px;
	margin: 0 auto;
	list-style: none;
	background-color: #e89e52;
}
.main-menu > li{
	float: left;
}
.main-menu > li a{
	font-size: 16px;
	display: block;
	padding: 10px 15px;
	text-decoration: none;
	border-right: 1px solid #e0caca;
	color: #fff;
}
.main-menu > li:last-child a{
	border-right: 0;
}
.main-menu li{
	position: relative;
}
.main-menu li .sub-menu{
	list-style: none;
	position: absolute;
	top: 100%;
	left: 0;
	width: 200px;
	box-shadow: 0px 1px 8px -4px #333;
	background-color: #e89e51;
	display: none;
}
.main-menu li .sub-menu ul{
	top: 0;
	left: 100%;
}
.main-menu li:hover > ul{
	display: block;
}
.main-menu li:hover > a {
	background: #b36c22;
}
</style>

Lấy menu đa cấp cho WordPress

<ul id="main-menu" class="nav">
 <?php 
  $menuLocations = get_nav_menu_locations(); 
  $menuID = $menuLocations['main-nav']; 
  $primaryNav = wp_get_nav_menu_items($menuID); 
  $id_parent =0;
  foreach ( $primaryNav as $navItem ) {
    if($navItem -> menu_item_parent == $id_parent){
        echo '<li class="menu-item'.$navItem ->ID.'"> <a href="'.$navItem->url.'" title="'.$navItem->title.'">'.$navItem->title.'</a>'; 
        $sub="";
        foreach ( $primaryNav as $navItem2 ) { 
           if($navItem2 -> menu_item_parent == $navItem ->ID){
           $sub .= '<li class="menu-item'.$navItem2 ->ID.'"> <a href="'.$navItem2->url.'" title="'.$navItem2->title.'">'.$navItem2->title.'</a>';
           $sub2="";
           foreach ( $primaryNav as $navItem3 ) { 
              if($navItem3 -> menu_item_parent == $navItem2 ->ID){
              $sub2 .= '<li class="menu-item'.$navItem3 ->ID.'"> <a href="'.$navItem3->url.'" title="'.$navItem3->title.'">'.$navItem3->title.'</a></li>';
           } 
        }
        $sub .= '<ul>'.$sub2.'</ul>'; 
        $sub .= '</li>';
        } 
      }
      echo '<ul>'.$sub.'</ul>';
      echo '</li>';
    }
  }
 ?>
 </ul>

Menu đa cấp bổ sung

<style>
*{
    margin: 0;
    padding: 0;
}
header, nav{
    /* canh giữa cách lề mỗi bên 10% */
    margin: 5px 10%;
}
nav{
    background: #484848; /* tô màu cho menu cha */
    border-radius: 5px; /* bo góc */
}
nav ul{
    display: flex;
}
nav> ul li{
    list-style: none; /* bỏ dấu chấm mặc định của li */
    /* kẻ đường bên trái và bên phải của li */
    border-right: 1px solid #ccc;
    border-left:1px solid #333;
}
nav> ul li a{
    display: block;
    padding: 0 25px;
    line-height: 50px;
    color: #f1f2f3;
    text-decoration: none;
}
nav ul li:first-child {
    border-left: none; /* bỏ đường kè trái của phần tử đầu tiên */
}
nav> ul li:first-child a{
    border-bottom-left-radius: 5px;
    border-top-left-radius: 5px;
}
/* Khi hover đến li, tô màu cho thẻ a */
nav ul li:hover>a{
    background: #ff0000;
    opacity: .7;
    color: yellow;
}
/*menu con*/
/*Ẩn các menu con cấp 1,2,3*/
nav li ul{
    display: none;
    min-width: 350px;
    position: absolute;
}
nav li>ul li{
    width: 100%;
    border: none;
    border-bottom: 1px solid #ccc;
    background: #999;
    text-align: left;
}
nav li>ul li:first-child a{
    border-bottom-left-radius: 0px;
    border-top-left-radius: 0px;
}
nav li>ul li:last-child {
    border-bottom-left-radius: 5px;
    border-bottom-right-radius: 5px;
}
nav li>ul li:last-child a{
    border-bottom-left-radius: 5px;
    border-bottom-right-radius: 5px;
}
/*khi hover thì hiện menu con*/
nav  li:hover > ul{
    display:  block;
}
/*Hiển thị menu con cấp 2,3,4 bên cạnh phải*/
nav > ul li > ul li >ul{
    margin-left: 352px;
    margin-top: -50px;
}
</style>
<nav>
    <ul>
        <li><a href="#">Trang chủ</a></li>
        <li><a href="#">Giới thiệu</a></li>
        <li><a href="#">Khóa học chuyên đề</a>
            <!-- menu con sổ xuống cấp 1 -->
            <ul>
                <li><a href="#">Lập trình C/C++</a></li>
                <li><a href="#">Lập trình Web với PHP&MySQL</a></li>
                <li>
                    <a href="#">Lập trình Web với ASP.NET MVC 5</a>
                    <!-- menu con sổ ngang cấp 2 -->
                    <ul>
                        <li><a href="#">1. Lập trình hướng đối tượng</a></li>
                        <li><a href="#">2. Lập trình cơ sở dữ liệu</a></li>
                        <li><a href="#">3. Lập trình giao diện web</a></li>
                        <li><a href="#">4. Lập trình ứng dụng ASP.NET</a></li>
                        <li>
                            <a href="#">5. Xây dựng dự án với ASP.NET</a>
                            <!-- menu con sổ ngang cấp 3 -->
                            <ul>
                                <li><a href="#">Xây dựng bài toán</a></li>
                                <li><a href="#">Thiết kế giao diện chức năng</a></li>
                                <li><a href="#">Phát triển dự án</a></li>
                            </ul>

                        </li>
                    </ul>
                </li>
                <li><a href="#">Lập trình Web Java Spring Framework</a></li>
            </ul>
        </li>
        <li><a href="#">Dịch vụ</a>
            <ul>
                <li><a href="#">Thực tập sinh chuyên đề</a></li>
                <li><a href="#">Sản xuất phần mềm</a></li>
            </ul>
        </li>
        <li><a href="#">Liên hệ</a></li>
    
    </ul>
</nav>
Posted in HTML, Lập trình web

Active bản quyền Elementor Pro

Bước 1: Mở file api.php trong đường dẫn sau: wp-content/plugins/elementor-pro/license

Bước 2: Sửa nội dung function get_license_data() thay bằng nội dung sau

public static function get_license_data( $force_request = false ) {
	return $license_data = [
		'license' => Admin::get_license_key(),
		'payment_id' => '0',
		'license_limit' => '100',
		'site_count' => '100',
		'activations_left' => '100',
	];
}

Bước 3: Sửa nội dung function is_license_active() thay bằng nội dung sau

public static function is_license_active() {
	$license_data = self::get_license_data();
	return true;
}

Bước 4: Sửa nội dung function is_license_about_to_expire() thay bằng nội dung sau

public static function is_license_about_to_expire() {
	$license_data = self::get_license_data();																								   
	return false;
	if ( 'lifetime' === $license_data['expires'] ) {
		return false;
	}
	return time() > strtotime( '-28 days', strtotime( $license_data['expires'] ) );
}

Bước 5: Lưu file api.php lại và mở file admin.php trong cùng thư mục lên.

Bước 6: Sửa nội dung function get_license_key() thay bằng nội dung sau

public static function get_license_key() {
	return 'fb351f05958872E193feb37a505a84be';
}

Bước 7: Sửa nội dung function get_connected_account() thay bằng nội dung sau

private function get_connected_account() {
	$user = (object) array( 'email' => 'contact@jangkeyte.com' );
	$email = '';
	if ( $user ) {
		$email = $user->email;
	}
	return $email;
}

Posted in Kinh nghiệm, Plugins, Wordpress

Tạo custom post type trong WordPress

Bước 1: Đăng ký post type Sản phẩm

add_action('init', 'product_register'); 
function product_register() { 
	//Arguments to create post type.
	$args = array( 'label' => __('Sản phẩm'), 
		'singular_label' => __('Product'), 
		'public' => true, 
		'show_ui' => true, 
		'capability_type' => 'post', 
		'hierarchical' => true, 
		'has_archive' => true,
		'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
		'rewrite' => array('slug' => 'products', 'with_front' => false), 
	); 

	//Register type and custom taxonomy for type.
	register_post_type( 'products' , $args ); 
	register_taxonomy("product-type", array("products"), array("hierarchical" => true, "label" => "Danh mục sản phẩm", "singular_label" => "Product Type", "rewrite" => true, "slug" => 'product-type')); 
}

Bước 2: Đăng ký menu danh mục sản phẩm

add_action("admin_init", "product_manager_add_meta"); 
function product_manager_add_meta(){ 
	add_meta_box("product-meta", "Product Options", "product_manager_meta_options", "products", "normal", "high"); 
} 

Bước 3: Hiển thị chi tiết các trường custom trong post sản phẩm (lưu ý check auto save)

function product_manager_meta_options() { 
	global $post; 
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
		return $post_id;
	$post_detail = get_post_custom($post->ID); 
	$banner= $post_detail["banner"][0];
	$price= $post_detail["price"][0]; ?> 

	<style type="text/css"> <?php include('css/product-manager.css'); ?></style>

	<div class="product_manager_extras">
		<div><label>Banner:</label><input name="banner" value="<?php echo $banner; ?>" /></div>
		<div><label>Giá sản phẩm:</label><input name="price" value="<?php echo $price; ?>" /></div>
	</div> 
<?php 
} 

Bước 4: Cập nhật dữ liệu custom sản phẩm

add_action('save_post', 'product_manager_save_extras'); 
function product_manager_save_extras(){ 
	global $post;
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ){ 
		// nếu bạn gỡ bỏ dòng này trời sẽ sập lên đầu bạn.
		return $post_id;
	} else {
		update_post_meta($post->ID, "banner", $_POST["banner"]);
		update_post_meta($post->ID, "price", $_POST["price"]); 
 	} 
}

Bước 6: Thêm các côt tiêu đề trong danh mục sản phẩm

add_filter("manage_edit-products_columns", "product_manager_edit_columns"); 
function product_manager_edit_columns($columns){
	$columns = array(
		"cb" => "<input type=\"checkbox\" />",
		"title" => "Tên sản phẩm",
		"description" => "Mô tả",
		"banner" => "Banner", 
		"price" => "Giá sản phẩm",
		"cat" => "Danh mục",
	); 
	return $columns;
} 

Bước 7: Hiển thị nội dung chi tiết từng sản phẩm

add_action("manage_products_posts_custom_column", "product_manager_custom_columns"); 
function product_manager_custom_columns($column){
	global $post;
	$post_detail = get_post_custom();
	switch ($column)
	{
		case "description":
			the_excerpt();
			break;
		case "banner":
			echo $post_detail["banner"][0];
			break;
		case "price":
			echo $post_detail["price"][0];
			break;
		case "cat":
			echo get_the_term_list($post->ID, 'product-type');
			break;
	}
}

Bước 8: Rewrite lại danh mục sản phẩm nếu chưa có cài đặt trong “Đường dẫn tĩnh”

add_action('init', 'director_rewrite');
function director_rewrite() {
	global $wp_rewrite;
	$wp_rewrite->add_permastruct('typename', 'typename/%year%/%postname%/', true, 1);
	add_rewrite_rule('typename/([0-9]{4})/(.+)/?$', 'index.php?typename=$matches[2]', 'top');
 	$wp_rewrite->flush_rules();
}

Bước 9: Gọi chi tiết sản phẩm trong nội dung


$post_detail = get_post_custom($post->ID);
$banner = $post_detail["banner"][0];
$price = $post_detail["price"][0];
$thumbnail = get_the_post_thumbnail($post->ID);
Posted in Lập trình web, Wordpress