Files
DESKTOP-GBA0BK8\Admin 7c8c8b1c76 first commit
2023-04-08 12:19:53 -04:00

604 lines
19 KiB
PHP

<?php
/**
* define some const
*/
define( 'THEME_URL', get_stylesheet_directory() );
define( 'CORE', THEME_URL . '/core' );
define( 'CLASSES', THEME_URL . '/classes' );
/**
* require /core/init.php
*/
require_once( CORE . '/init.php' );
/**
* require /class/*
*/
require_once( CLASSES . '/widgets/float-widget-recent-post.php' );
require_once( CLASSES . '/widgets/float-widget-incoming-post.php' );
require_once( CLASSES . '/widgets/float-widget-newsletter.php' );
require_once( CLASSES . '/wp-bootstrap-navwalker.php' );
if ( !function_exists('float_theme_setup') ) {
function float_theme_setup() {
/* set up textdommain */
$languageFolder = THEME_URL . '/languages';
load_theme_textdomain( 'float', $languageFolder );
/* auto add RSS link to <head> */
add_theme_support( 'automatic-feed-links' );
/* add title-tag */
add_theme_support( 'title-tag' );
/* add menu */
register_nav_menu( 'primary-menu', __('Primary Menu', 'float') );
/* add post thumbnail */
add_theme_support( 'post-thumbnails' );
}
}
add_action( 'init', 'float_theme_setup' );
/**
* init widget
*/
if ( !function_exists('float_widgets_init') ) {
function float_widgets_init() {
$sidebar = array(
'name' => __('Main Sidebar', 'float'),
'id' => 'main-sidebar',
'description' => __('Default sidebar', 'float'),
'class' => 'main-sidebar',
'before_title' => '<h3 class="widgettitle">',
'after_title' => '</h3>'
);
register_sidebar( $sidebar );
}
}
add_action( 'widgets_init', 'float_widgets_init' );
/**
* Enqueue scripts and styles.
*/
function float_scripts() {
wp_register_script( 'app-main-script', get_template_directory_uri() . '/dist/app.js', array('jquery'), '1.0.0', true );
wp_localize_script('app-main-script', 'ajax_object', array('ajax_url' => admin_url( 'admin-ajax.php'), 'google_client_id' => defined("GOOGLE_CLIENT_APP_ID") ? GOOGLE_CLIENT_APP_ID : "343605975098-i4p86p4la6lpff0rmsq3mg36vi9do9rb.apps.googleusercontent.com" ));
wp_localize_script('app-main-script', 'contact_settings', array(
'sg_contact' => defined("SG_CONTACT_LIST") ? SG_CONTACT_LIST : "f6ff7833-d6cf-425e-a426-395ac201b794",
'us_contact' => defined("US_CONTACT_LIST") ? US_CONTACT_LIST : "a646ee53-dfec-4a6a-a0c3-102c6840df06",
'default_list' => defined("DEFAULT_CONTACT_LIST") ? DEFAULT_CONTACT_LIST : "6e36b912-7cc3-4fb2-ba50-a664fbefb11b"
));
wp_enqueue_script( 'app-main-script' );
}
add_action( 'wp_enqueue_scripts', 'float_scripts' );
function float_styles() {
wp_register_style( 'app-main-style', get_template_directory_uri() . '/style.css', array(), '1.0.0', 'all' );
wp_enqueue_style( 'app-main-style' );
}
add_action( 'wp_enqueue_scripts', 'float_styles' );
/**
* set up menu
*/
if ( !function_exists('float_menu') ) {
function float_menu($menu) {
$menu = array(
'theme_location' => $menu,
'container' => false,
'menu_class' => 'navbar-nav ml-auto',
'depth' => 5,
'fallback_cb' => false,
'walker' => new Bootstrap_Menu_Walker()
);
wp_nav_menu( $menu );
}
}
/**
* add more menu item
*/
function add_signup_link( $items, $args ) {
if ($args->theme_location == 'primary-menu') {
$items .= '<li class="my-auto"><a class="menu-signup-btn btn btn-sm text-white" role="button" data-toggle="modal" data-target="#signupModal" href="#">Sign up</a></li>';
}
return $items;
}
add_filter( 'wp_nav_menu_items', 'add_signup_link', 10, 2 );
/**
* process ajax call newsletter subcribe
*/
function subcribe_news_letter_ajax() {
return subscribeUser();
}
add_action('wp_ajax_subcribe_news_letter_ajax', 'subcribe_news_letter_ajax');
add_action('wp_ajax_nopriv_subcribe_news_letter_ajax', 'subcribe_news_letter_ajax');
/**
* add action for ajax call newsletter subcribe
*/
add_action('mc4wp_form_respond', function($form) {
die(json_encode($form));
});
/**
* add filter for shortcode_atts_arve
*/
function float_filter_detect_youtube_loop($atts) {
if (
'youtube' !== $atts['provider'] ||
( empty( $atts['url'] ) && empty( $atts['id'] ) )
) {
return $atts;
}
if ( empty( $atts['url'] ) ) {
# Not a url but it will work
$url = str_replace( array( '&playlist=', '&amp;playlist=' ), '?playlist=', $atts['id'] );
} else {
$url = $atts['url'];
}
$query_array = arve_url_query_array( $url );
if (!isset($atts['loop']) || (isset($atts['loop']) && $atts['loop'] != 'yes')) {
return $atts;
}
$atts['id'] = strtok( $atts['id'], '?' );
$atts['id'] = strtok( $atts['id'], '&' );
if ( empty( $query_array['playlist'] ) ) {
$atts['parameters'] .= 'playlist=' . $atts['id'];
} else {
$atts['parameters'] .= 'playlist=' . $query_array['playlist'];
}
return $atts;
}
add_filter( 'shortcode_atts_arve', 'float_filter_detect_youtube_loop', -8 );
/**
* set Popular Posts by Views
*/
function float_set_post_views($postID) {
$count_key = 'float_post_views_count';
$count = get_post_meta($postID, $count_key, true);
if (empty($count)) {
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, 1);
} else {
$count++;
update_post_meta($postID, $count_key, $count);
}
}
// Remove issues with prefetching adding extra views
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
/**
* display the post view count
*/
function float_get_post_views($postID){
$count_key = 'float_post_views_count';
$count = get_post_meta($postID, $count_key, true);
if($count == ''){
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
return 0;
}
return $count;
}
/**
* process signup form
*/
function float_signup_ajax() {
// Verify nonce
// if( !isset( $_POST['float_signup_user_nonce'] ) || !wp_verify_nonce( $_POST['float_signup_user_nonce'], 'float_signup_user' ) ) {
// die( 'Ooops, something went wrong, please try again later.' );
// }
// Post values
$fullname = trim($_POST['full_name']);
$email = trim($_POST['email']);
// validate form
$errors = [];
if (empty($email)) {
$errors['email'][] = 'This field is required.';
}
if (!is_email($email)) {
$errors['email'][] = 'Please enter a valid email address.';
}
if (email_exists($email)) {
$errors['email'][] = 'Sorry, that email address is already used!';
}
$userdata = [
'user_login' => $email,
'user_email' => $email,
'display_name' => $fullname,
'role' => 'subscriber'
];
// Return
if (!empty($errors)) {
$respone_data = [
'success' => false,
'message' => $errors
];
} else {
$user_id = wp_insert_user( $userdata );
if( !is_wp_error($user_id) ) {
$respone_data = [
'success' => true,
'message' => 'We have created an account for you.'
];
} else {
$respone_data = [
'success' => false,
'message' => $user_id->get_error_message()
];
}
}
$respone_data = json_encode($respone_data);
die($respone_data);
}
/**
* Detect user location based on user's IP
*/
function get_user_location() {
$ip = get_user_ip();
$result = [
'country'=>'',
'city'=>'',
'timezone' => 'Asia/Singapore',
'region_name'=>'',
'country_code'=>'',
'lat'=>'',
'lng'=>''
];
$ip_data = @json_decode(file_get_contents('http://www.geoplugin.net/json.gp?ip='.$ip));
if($ip_data && $ip_data->geoplugin_countryName != null){
$result['country'] = $ip_data->geoplugin_countryName;
$result['city'] = $ip_data->geoplugin_city;
$result['timezone'] = $ip_data->geoplugin_timezone;
$result['region_name'] = $ip_data->geoplugin_region;
$result['country_code'] = $ip_data->geoplugin_countryCode;
$result['lat'] = $ip_data->geoplugin_latitude;
$result['lng'] = $ip_data->geoplugin_longitude;
}
return $result;
}
function get_user_ip() {
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote = @$_SERVER['REMOTE_ADDR'];
if(filter_var($client, FILTER_VALIDATE_IP)){
$ip = $client;
}elseif(filter_var($forward, FILTER_VALIDATE_IP)){
$ip = $forward;
}else{
$ip = $remote;
}
return $ip;
}
function get_latest_articles($request) {
$limit = isset($_GET['limit']) ? intval(trim($_GET['limit'])) : 10;
$page = isset($_GET['page']) ? intval(trim($_GET['page'])) : 1;
if (!isset($limit) || !is_int($limit) || $limit <= 0) {
$limit = 10; // Set limit to by 10 as default
}
if (!isset($page) || !is_int($page) || $page <= 0) {
$page = 1; // Set default page
}
$query = new WP_Query( array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => $limit,
'paged' => $page,
'orderby' => 'date',
'order' => 'DESC'
) );
if ( !$query->have_posts() ) {
return new WP_Error( 'empty_post', 'there is no post ', array('status' => 404) );
}
// add meta to post
$newPost = array();
foreach ( $query->posts as $key => $post ) {
add_meta_value_to_posts( $post );
array_push( $newPost, $post );
}
wp_reset_postdata();
// Add co-authors to post if exists
foreach ( $newPost as $post ) {
$co_authors = get_coauthors( $post->ID );
$result = [];
foreach ( $co_authors as $co_author ) {
if (get_class($co_author) !== 'WP_User') {
array_push($result, $co_author->display_name);
continue;
}
array_push($result, $co_author->data->display_name);
}
if ( !empty($result) ) {
$post->co_authors = $result;
}
}
$response = new WP_REST_Response( $newPost );
$response->set_status(200);
return $response;
}
function get_article_by_id($request) {
$post_id = isset($request['id']) && intval($request['id']) ? intval($request['id']) : NULL;
if (empty($post_id)) {
return new WP_Error( 'error', 'missing post id params ', array('status' => 400) );
}
$post = get_post( $post_id );
if (empty($post)) {
return new WP_Error( 'empty_post', 'there is no post ', array('status' => 404) );
}
add_meta_value_to_posts( $post );
// Add co-authors to post if exists
$co_authors = get_coauthors( $post->ID );
$result = [];
foreach ( $co_authors as $co_author ) {
if (get_class($co_author) !== 'WP_User') {
array_push($result, $co_author->display_name);
continue;
}
array_push($result, $co_author->data->display_name);
}
if ( !empty($result) ) {
$post->co_authors = $result;
}
$response = new WP_REST_Response($post);
$response->set_status(200);
return $response;
}
function subscribeUser() {
// Post values
$name = trim($_POST['name']);
$first_name = trim($_POST['first_name']);
$last_name = trim($_POST['last_name']);
$email = trim($_POST['email']);
$phone = trim($_POST['phone']);
// $list_id = '6e36b912-7cc3-4fb2-ba50-a664fbefb11b';
// validate form
$errors = [];
if (empty($email)) {
$errors['email'][] = 'Email is required.';
} else if (!is_email($email)) {
$errors['email'][] = 'Please enter a valid email address.';
}
if (isset($errors) && count($errors)) {
die(json_encode(['success' => NULL, 'errors' => $errors]));
}
$data = [
'email' => $email,
'first_name' => $first_name,
'last_name' => $last_name,
'phone' => $phone,
'name' => $name,
'list_id' => $list_id,
];
$api = curl_init(); // initialize cURL connection
$baseUrl = 'https://float.sg/api';
$api_url = $baseUrl . '/newsletter-subscribe';
curl_setopt($api, CURLOPT_URL, $api_url);
curl_setopt($api, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: Bearer 99dfe35fcb7de1ee'));
curl_setopt($api, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
curl_setopt($api, CURLOPT_RETURNTRANSFER, true); // return the API response
curl_setopt($api, CURLOPT_CUSTOMREQUEST, 'POST'); // method POST
curl_setopt($api, CURLOPT_TIMEOUT, 10);
curl_setopt($api, CURLOPT_POST, true);
curl_setopt($api, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($api, CURLOPT_POSTFIELDS, json_encode($data) ); // send data in json
$result = curl_exec($api);
die($result);
}
add_action('rest_api_init', function () {
register_rest_route( 'float/v1', 'latest-articles',array(
'methods' => 'GET',
'callback' => 'get_latest_articles',
'permission_callback' => '__return_true'
));
register_rest_route( 'float/v1', 'articles/(?P<id>\d+)',array(
'methods' => 'GET',
'callback' => 'get_article_by_id',
'permission_callback' => '__return_true'
));
});
add_action('wp_ajax_float_signup_ajax', 'float_signup_ajax');
add_action('wp_ajax_nopriv_float_signup_ajax', 'float_signup_ajax');
// PRIVATE functions
function prepare_get_posts_query($args) {
$query = 'SELECT posts.*, pm.meta_key, pm.meta_value, u.display_name from wp_posts posts
LEFT JOIN wp_posts as temp on (temp.post_parent = posts."ID")
LEFT JOIN wp_postmeta pm ON (temp."ID" = pm.post_id)
LEFT JOIN wp_users u ON (u."ID" = posts.post_author)
WHERE posts."ID" IN (';
$limit = 10;
$limit_query = 'LIMIT 10';
$offset_query = 'OFFSET 0';
$sub_query = 'SELECT "ID" FROM wp_posts p WHERE p.post_status = \'publish\' AND p.post_type= \'post\'';
if (isset($args['id'])) {
$sub_query .= ' AND p."ID" = ' . $args['id'];
}
if (isset($args['limit'])) {
$limit = $args['limit'];
$limit_query = 'LIMIT ' . $limit;
}
if (isset($args['page'])) {
$offset_query = 'OFFSET ' . ($args['page'] - 1) * $limit;
}
$sub_query .= ' ORDER BY p.post_date DESC ' . $limit_query . ' ' . $offset_query . ')';
$query .= $sub_query . ' GROUP BY posts."ID", pm.meta_key, pm.meta_value, u.display_name
ORDER BY posts.post_date DESC ';
return $query;
}
/**
* Additional meta data to post
* @param WP_POST &$post
*/
function add_meta_value_to_posts( &$post ) {
if ( !$post ) {
return;
}
// get all custom fields
if ( function_exists( 'get_fields' ) ) {
$post_meta = get_fields( $post->ID );
if ( $post_meta ) {
foreach ( $post_meta as $key => $meta ) {
if ( !empty($meta) && is_string($meta) && preg_match( '/^http|^https:\/\/.*?/m', $meta ) ) {
$meta = encodeURI( $meta );
}
$post->$key = $meta;
}
}
}
// get post author
$post->display_name = get_the_author_meta( 'display_name', $post->post_author );
// get featured image
$post->featured_image = encodeURI( get_the_post_thumbnail_url( $post ) );
$post->_wp_attachment_metadata = get_post_meta( $post->ID, '_wp_attachment_metadata', true );
}
function handle_get_posts_by_query($query) {
global $wpdb;
$posts = $wpdb->get_results($query);
if (empty($posts)) {
return [];
}
$posts = json_decode(json_encode($posts), true);
// Parse data for response
$results = [];
foreach($posts as $p) {
$data = json_decode(json_encode($p), true);
$data['content'] = apply_filters('the_content', $p['post_content']);
$id = $data['ID'];
$meta_key = $data['meta_key'];
$meta_value = $data['meta_value'];
$featured_image = NULL;
if ($meta_key == '_wp_attached_file') {
$featured_image = 'wp-content/uploads/'.$meta_value;
}
if (isset($results[$id])) {
$results[$id][$meta_key] = $meta_value;
if ($featured_image) {
$results[$id]['featured_image'] = $featured_image;
}
continue;
}
// If post does not appear in list yet.
// Add new post to the results.
unset($data['meta_key']);
unset($data['meta_value']);
$data[$meta_key] = $meta_value;
if ($featured_image) {
$data['featured_image'] = $featured_image;
}
$results[$id] = $data;
}
return array_values($results);
}
function encodeURI($url) {
// http://php.net/manual/en/function.rawurlencode.php
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI
$unescaped = array(
'%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~',
'%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')'
);
$reserved = array(
'%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':',
'%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$'
);
$score = array(
'%23'=>'#'
);
return strtr(rawurlencode($url), array_merge($reserved,$unescaped,$score));
}
function add_meta_tags() {
global $post;
if ( is_singular() ) {
$des_post = strip_tags( $post->post_content );
$des_post = strip_shortcodes( $des_post );
$des_post = str_replace( array("\n", "\r", "\t"), ' ', $des_post );
$des_post = trim( $des_post );
$des_post = mb_substr( $des_post, 0, 300, 'utf8' );
echo '<meta name="description" content="' . $des_post . '" />' . "\n";
echo '<meta property="og:title" content="' . $post->post_title . '" />' . "\n";
echo '<meta property="og:description" content="' . $des_post . '" />' . "\n";
echo '<meta property="og:type" content="article">' . "\n";
echo '<meta property="og:image" content="' . get_the_post_thumbnail_url($post->ID) . '">' . "\n";
echo '<meta property="og:url" content="' . $post->guid . '">' . "\n";
echo '<meta property="og:site_name" content="' . get_bloginfo( 'name' ) . '">' . "\n";
echo '<meta name="twitter:card" content="summary_large_image">' . "\n";
echo '<meta name="twitter:image" content="' . get_the_post_thumbnail_url($post->ID) . '">' . "\n";
}
if ( is_home() ) {
echo '<meta name="description" content="' . get_bloginfo( 'description' ) . '" />' . "\n";
echo '<meta property="og:title" content="' . get_bloginfo( 'name' ) . '" />' . "\n";
echo '<meta property="og:description" content="' . get_bloginfo( 'description' ) . '" />' . "\n";
echo '<meta property="og:url" content="' . get_site_url() . '">' . "\n";
echo '<meta property="og:site_name" content="' . get_bloginfo( 'name' ) . '">' . "\n";
}
if ( is_category() ) {
$des_cat = strip_tags(category_description());
echo '<meta name="description" content="' . $des_cat . '" />' . "\n";
}
}
add_action('wp_head', 'add_meta_tags');