|
|
|
Wordpress+ php ผมดึงค่ามาจาก Page Visit Counter ใส่ใน stm_counter แล้ว Error ครับ |
|
|
|
|
|
|
|
จากรูปถ้าเอาไปใส่ใน stm_counter ค่ามันจะได้ 300 แล้ว ข้อมูลที่เหลือก็จะ Error หมด ไม่แสดง icon และ title
แต่บรรทัดล่างที่แยกมาต่างหาก จะเห็นว่าค่าได้ 6 ครับ
ไม่ทราบว่าต้องแก้ยังไงครับ
stm_counter.php
Code (PHP)
<?php
global $wp_filesystem;
if ( empty( $wp_filesystem ) ) {
require_once ABSPATH . '/wp-admin/includes/file.php';
WP_Filesystem();
}
$atts = vc_map_get_attributes( $this->getShortcode(), $atts );
extract( $atts );
$css_class = apply_filters( VC_SHORTCODE_CUSTOM_CSS_FILTER_TAG, vc_shortcode_custom_css_class( $css, ' ' ) );
if( $el_class ){
$css_class = ' ' . $el_class;
}
if ( ! wp_is_mobile() ) {
wp_enqueue_script( 'countUp' );
wp_enqueue_script( 'jquery.appear' );
if( $drawing ){
wp_enqueue_script( 'vivus' );
}
}
$counter_id = uniqid( 'counter_' );
$icon_div_id = uniqid( 'icon_wr_' );
$icon_id = uniqid( 'icon_' );
$icon_style = array();
$title_style = array();
if( $icon_color ){
$icon_style['color'] = 'color: ' . $icon_color . ';';
}
if( $icon_width ){
$icon_style['width'] = 'width: ' . $icon_width . 'px;';
}
if( $icon_size ){
$icon_style['font-size'] = 'font-size: ' . $icon_size . 'px;';
}
if( $font_color ){
$title_style['color'] = 'color: ' . $font_color . ';';
}
?>
<?php if( $counter_value ): ?>
<div class="stm_counter<?php echo esc_attr( $css_class ); ?>">
<?php if( $icon ): ?>
<div class="icon"<?php echo( ( $icon_style ) ? ' style="' . esc_attr( implode( ' ', $icon_style ) ) . '"' : '' ); ?>>
<i class="<?php echo esc_attr( $icon ); ?>"></i>
</div>
<?php elseif( $drawing_icon ): ?>
<div id="<?php echo esc_attr( $icon_div_id ); ?>" class="icon"<?php echo( ( $icon_style ) ? ' style="' . esc_attr( implode( ' ', $icon_style ) ) . '"' : '' ); ?>>
<?php echo $wp_filesystem->get_contents( get_template_directory() . '/assets/images/drawing_icons/' . esc_attr( $drawing_icon ) . '.svg' ); ?>
</div>
<?php endif; ?>
<div class="text">
<?php if ( wp_is_mobile() ) { ?>
<div class="value"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?> id="<?php echo esc_attr( $counter_id ); ?>"><?php echo esc_attr( $counter_value_pre ); ?><?php echo esc_attr( $counter_value ); ?><?php echo esc_attr( $counter_value_suf ); ?></div>
<?php } else { ?>
<div class="value"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?> id="<?php echo esc_attr( $counter_id ); ?>"></div>
<?php } ?>
<?php if ( $title ) { ?>
<div class="title"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?>><?php echo wp_kses_post( $title ); ?></div>
<?php } ?>
</div>
</div>
<?php if( $drawing_icon ): ?>
<style type="text/css" scoped>
<?php echo "#" . $icon_id; ?>{
<?php
if( $icon_size ){
echo "height: " . esc_attr( $icon_size ) . "px;\n";
}
if( $icon_width_svg ){
echo "width: " . esc_attr( $icon_width_svg ) . "px;\n";
}
if( $icon_color ){
echo "stroke: " . esc_attr( $icon_color ) . ";\n";
}
?>
}
</style>
<?php endif; ?>
<script type="text/javascript">
jQuery(document).ready(function ($) {
$("#<?php echo esc_js( $icon_div_id ); ?> svg").attr( 'id', '<?php echo esc_js( $icon_id ); ?>' );
<?php if ( ! wp_is_mobile() ): ?>
var <?php echo esc_js( $counter_id ); ?> = new countUp("<?php echo esc_js( $counter_id ); ?>", 0, <?php echo esc_js( $counter_value ); ?>, 0, <?php echo esc_js( $duration ); ?>, {
useEasing: true,
useGrouping: false,
prefix : '<?php echo esc_attr( $counter_value_pre ); ?>',
suffix : '<?php echo esc_attr( $counter_value_suf ); ?>'
});
var inited = false;
$("#<?php echo esc_js( $counter_id ); ?>").appear({ force_process: true });
$("#<?php echo esc_js( $counter_id ); ?>").on('appear', function () {
if (!inited) {
<?php echo esc_js( $counter_id ); ?>.start();
inited = true;
}
});
<?php if( $drawing_icon ): ?>
new Vivus('<?php echo esc_js( $icon_id ); ?>', {
type: 'async',
duration: 150,
animTimingFunction: Vivus['EASE_OUT']
});
<?php endif; ?>
<?php endif; ?>
});
</script>
<?php endif; ?>
Code (PHP)
<!--?php
/*
* @link https://www.thedotstore.com/
* @since 1.0.0
* @package Page_Visit_Counter
*
* @wordpress-plugin
* Plugin Name: Page Visit Counter
* Plugin URI: https://www.thedotstore.com/page-visit-counter/
* Description: This plugin will count the total visits of the pages of your site.
* Version: 6.0.8
* Author: theDotstore
* Author URI: https://www.thedotstore.com/
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Domain Path: /languages
* WC tested up to: 4.5
*/
// If this file is called directly, abort.
if ( !defined( 'ABSPATH' ) ) {
exit;
}
if ( function_exists( 'pvc_fs' ) ) {
pvc_fs()--->
<html><head>
<meta http-equiv="content-type" content="text/html; charset=windows-1252"></head><body>set_basename(
false, __FILE__ );
return;
}
if ( !function_exists( 'pvc_fs' ) ) {
// Create a helper function for easy SDK access.
function pvc_fs()
{
global $pvc_fs ;
if ( !isset( $pvc_fs ) ) {
// Include Freemius SDK.
require_once dirname( __FILE__ ) . '/freemius/start.php';
$pvc_fs = fs_dynamic_init( array(
'id' => '4453',
'slug' => 'page-visit-counter',
'type' => 'plugin',
'public_key' =>
'pk_e7705ac1700ddfca594652ad4470e',
'is_premium' => false,
'premium_suffix' => 'Pro',
'has_addons' => false,
'has_paid_plans' => true,
'menu' => array(
'slug' => 'pvcp-get-started',
'first-path' => 'admin.php?page=pvcp-get-started',
'contact' => false,
'support' => false,
),
'is_live' => true,
) );
}
return $pvc_fs;
}
// Init Freemius.
pvc_fs();
// Signal that SDK was initiated.
do_action( 'pvc_fs_loaded' );
}
if ( !defined( 'PVCP_VERSION' ) ) {
define( 'PVCP_VERSION', '6.0.8' );
}
if ( !defined( 'PVCP_PLUGIN_URL' ) ) {
define( 'PVCP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
}
if ( !defined( 'PVCP_PLUGIN_DIR' ) ) {
define( 'PVCP_PLUGIN_DIR', dirname( __FILE__ ) );
}
if ( !defined( 'PVCP_PLUGIN_DIR_PATH' ) ) {
define( 'PVCP_PLUGIN_DIR_PATH', plugin_dir_path( __FILE__ ) );
}
if ( !defined( 'PVCP_PLUGIN_BASENAME' ) ) {
define( 'PVCP_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
}
/** The code that runs during plugin activation.
*
* @package Page_Visit_Counter
* @since 1.0.0
*/
function activate_page_visit_counter()
{
require_once plugin_dir_path( __FILE__ ) .
'includes/class-page-visit-counter-activator.php';
Page_Visit_Counter_Activator::activate();
}
/** The code that runs during plugin deactivation.
*
* @package Page_Visit_Counter
* @since 1.0.0
*/
function deactivate_page_visit_counter()
{
require_once plugin_dir_path( __FILE__ ) .
'includes/class-page-visit-counter-deactivator.php';
Page_Visit_Counter_Deactivator::deactivate();
}
register_activation_hook( __FILE__, 'activate_page_visit_counter' );
register_deactivation_hook( __FILE__, 'deactivate_page_visit_counter' );
/**
* The core plugin class that is used to define internationalization,
* admin-specific hooks, and public-facing site hooks.
*/
require plugin_dir_path( __FILE__ ) .
'includes/class-page-visit-counter.php';
/**
* Begins execution of the plugin.
*
* Since everything within the plugin is registered via hooks,
* then kicking off the plugin from this point in the file does
* not affect the page life cycle.
*
* @since 1.0.0
*/
function run_page_visit_counter()
{
$plugin = new Page_Visit_Counter();
$plugin->run();
}
run_page_visit_counter();
/**
* Get individual page visit count
*
* @since 1.0.0
* @return string
*/
function page_visit_counter_md_page_visit( $atts, $content, $tag )
{
global $wpdb ;
$current_page_id = get_the_ID();
$type = get_post_type( $current_page_id );
$shortcodes = '[' . $tag . ']';
$wzResult = $wpdb->get_results( $wpdb->prepare( "SELECT
wizard_setting,status FROM {$wpdb->prefix}page_visit_wizard WHERE
shortcode = %s", $shortcodes ) );
//db call ok; no-cache ok
$totalVisitsHtml = '';
// get individual wizard setting
$page_wizards = maybe_unserialize( $wzResult[0]->wizard_setting
);
// get individual wizard status
$page_status = $wzResult[0]->status;
$page_meta_value = get_post_meta( $current_page_id,
'enable_page_count' );
$general_wizard_setting = maybe_unserialize( get_option(
'pvcp_general_settings' ) );
// get general wizard setting
if ( 'on' === $page_status && (empty($page_meta_value) ||
in_array( 'yes', $page_meta_value )) &&
(empty($general_wizard_setting['pvcp_general_post_type']) || in_array(
$type, $general_wizard_setting['pvcp_general_post_type'] )) ) {
// get title
if ( !empty($general_wizard_setting['pvcp_general_title']) ) {
$title = $general_wizard_setting['pvcp_general_title'];
} else {
$title = 'Total Page Visits';
}
// get background color
if ( isset( $page_wizards['pvcp_ind_wz_bc_color'] ) &&
!empty($page_wizards['pvcp_ind_wz_bc_color']) ) {
$backgroundColor = trim(
$page_wizards['pvcp_ind_wz_bc_color'] );
} elseif (
!empty($general_wizard_setting['pvcp_general_bc_color']) ) {
$backgroundColor = trim(
$general_wizard_setting['pvcp_general_bc_color'] );
} else {
$backgroundColor = '#FFFFFF';
}
// get font color
if ( isset( $page_wizards['pvcp_ind_wz_font_color'] ) &&
!empty($page_wizards['pvcp_ind_wz_font_color']) ) {
$fontColor = trim( $page_wizards['pvcp_ind_wz_font_color']
);
} elseif (
!empty($general_wizard_setting['pvcp_general_font_color']) ) {
$fontColor = trim(
$general_wizard_setting['pvcp_general_font_color'] );
} else {
$fontColor = '#000000';
}
$totalCount = $wpdb->get_var( $wpdb->prepare( "SELECT
count(*) FROM {$wpdb->prefix}page_visit_history WHERE page_id = %d",
$current_page_id ) );
$totalVisitsHtml .= '<div class="page_counter_label"><span class="page_counter_text" style="color:' . esc_attr( $fontColor ) . ';background:' . esc_attr( $backgroundColor ) . ';">' . __( $title, 'page-visit-counter' ) . ': ' . $totalCount . '</span></div>';
}
return $totalVisitsHtml;
}
add_shortcode( 'pvcp_1', 'page_visit_counter_md_page_visit' );
/**
* Get total website visit count
*
* @since 1.0.0
* @return string
*/
function page_visit_counter_md_total_sites_visit()
{
global $wpdb ;
$current_page_id = get_the_ID();
$type = get_post_type( $current_page_id );
// get general wizard setting
$general_wizard_setting = maybe_unserialize( get_option( 'pvcp_general_settings' ) );
$title = '';
// get background color
if ( !empty($general_wizard_setting['pvcp_general_bc_color']) ) {
$backgroundColor = trim( $general_wizard_setting['pvcp_general_bc_color'] );
} else {
$backgroundColor = '#FFFFFF';
}
// get font color
if ( !empty($general_wizard_setting['pvcp_general_font_color']) ) {
$fontColor = trim( $general_wizard_setting['pvcp_general_font_color'] );
} else {
$fontColor = '#000000';
}
$totalWebsiteVisitsHtml = '';
$totalWebsiteCount = $wpdb->get_var( "SELECT count(*) FROM {$wpdb->prefix}page_visit_history" );
$totalWebsiteVisitsHtml .= '<div class="page_counter_label"><span class="page_counter_text" style="color:' . esc_attr( $fontColor ) . ';background:' . esc_attr( $backgroundColor ) . ';">' . __( $title, 'page-visit-counter' ) . $totalWebsiteCount . '</span></div>';
return $totalWebsiteCount;
}
add_shortcode( 'pvcp_website_count', 'page_visit_counter_md_total_sites_visit' );</body></html>
Tag : PHP
|
|
|
|
|
|
Date :
2021-01-13 11:09:38 |
By :
lamaka.tor |
View :
1275 |
Reply :
27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
error ว่าอะไร?
เพิ่มเติม: ติดตั้ง debug plugin บนเครื่อง development (localhost) แล้วดูรายละเอียด
|
ประวัติการแก้ไข 2021-01-13 13:37:19
|
|
|
|
Date :
2021-01-13 13:36:58 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 1 เขียนโดย : lakornworld เมื่อวันที่ 2021-01-13 12:41:44
รายละเอียดของการตอบ ::
แบบนี้ถูกไม๊ ครับ
Code (PHP)
<?php if( $counter_value ): ?>
<div class="stm_counter<?php echo esc_attr( $css_class ); ?>">
<?php
$findme = '[';
$pos = strpos($ $counter_value, $findme);
if ($pos === false) {
$counter_value_ = $counter_value ;
} else {
$counter_value_ = do_shortcode($counter_value);
}
?>
<?php if( $icon ): ?>
<div class="icon"<?php echo( ( $icon_style ) ? ' style="' . esc_attr( implode( ' ', $icon_style ) ) . '"' : '' ); ?>>
<i class="<?php echo esc_attr( $icon ); ?>"></i>
</div>
<?php elseif( $drawing_icon ): ?>
<div id="<?php echo esc_attr( $icon_div_id ); ?>" class="icon"<?php echo( ( $icon_style ) ? ' style="' . esc_attr( implode( ' ', $icon_style ) ) . '"' : '' ); ?>>
<?php echo $wp_filesystem->get_contents( get_template_directory() . '/assets/images/drawing_icons/' . esc_attr( $drawing_icon ) . '.svg' ); ?>
</div>
<?php endif; ?>
<div class="text">
<?php if ( wp_is_mobile() ) { ?>
<div class="value"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?> id="<?php echo esc_attr( $counter_id ); ?>"><?php echo esc_attr( $counter_value_pre ); ?><?php echo esc_attr( $$counter_value_ ); ?><?php echo esc_attr( $counter_value_suf ); ?></div>
<?php } else { ?>
<div class="value"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?> id="<?php echo esc_attr( $counter_id ); ?>"></div>
<?php } ?>
<?php if ( $title ) { ?>
<div class="title"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?>><?php echo wp_kses_post( $title ); ?></div>
<?php } ?>
</div>
</div>
<?php if( $drawing_icon ): ?>
<style type="text/css" scoped>
<?php echo "#" . $icon_id; ?>{
<?php
if( $icon_size ){
echo "height: " . esc_attr( $icon_size ) . "px;\n";
}
if( $icon_width_svg ){
echo "width: " . esc_attr( $icon_width_svg ) . "px;\n";
}
if( $icon_color ){
echo "stroke: " . esc_attr( $icon_color ) . ";\n";
}
?>
}
</style>
<?php endif; ?>
<script type="text/javascript">
jQuery(document).ready(function ($) {
$("#<?php echo esc_js( $icon_div_id ); ?> svg").attr( 'id', '<?php echo esc_js( $icon_id ); ?>' );
<?php if ( ! wp_is_mobile() ): ?>
var <?php echo esc_js( $counter_id ); ?> = new countUp("<?php echo esc_js( $counter_id ); ?>", 0, <?php echo esc_js( $counter_value_ ); ?>, 0, <?php echo esc_js( $duration ); ?>, {
useEasing: true,
useGrouping: false,
prefix : '<?php echo esc_attr( $counter_value_pre ); ?>',
suffix : '<?php echo esc_attr( $counter_value_suf ); ?>'
});
var inited = false;
$("#<?php echo esc_js( $counter_id ); ?>").appear({ force_process: true });
$("#<?php echo esc_js( $counter_id ); ?>").on('appear', function () {
if (!inited) {
<?php echo esc_js( $counter_id ); ?>.start();
inited = true;
}
});
<?php if( $drawing_icon ): ?>
new Vivus('<?php echo esc_js( $icon_id ); ?>', {
type: 'async',
duration: 150,
animTimingFunction: Vivus['EASE_OUT']
});
<?php endif; ?>
<?php endif; ?>
});
</script>
<?php endif; ?>
|
|
|
|
|
Date :
2021-01-13 14:53:47 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 7 เขียนโดย : lakornworld เมื่อวันที่ 2021-01-13 16:01:43
รายละเอียดของการตอบ ::
1.
Code
WP เป็นแอปพลิเคชันแบบโครงสร้าง (structured flow) ดังนั้น เมื่อเราติดตั้งและ enable plugin ใน theme ใด theme นั้นจะสามารถสื่อสารกับ plugin ได้เอง
คำว่า สื่อสารกับ plugin ได้เอง ในที่นี้ คือยังไงครับ
ประมาณว่า stm_counter เรียกใช้
function page_visit_counter_md_total_sites_visit()
ที่อยู่ใน page-visit-counter.php ได้เลย หรือปล่าวครับ
2.
Code
ส่วนที่ต้องทำคือหา(search in files) ฟังก์ชันของ shortcode ใน theme แล้วไปแก้ไข callback ก็จะสามารถ post ใน editor ตามข้อ 1 #1 ได้ครับ
[/coding]
ถ้าข้อ 1. ทำได้
การ add_shortcode ใน stm_counter จะมีผลให้ตัวเลขอื่นๆ ที่ใส่ไว้ใน counter_value มีปัญหา ไม๊ ครับ
เดิมที counter_value รับค่า เป็น string(หรือปล่าว ไม่แน่ใจครับ)
ถ้าเราปรับแก้โค้ด counter_value จะยังรับค่าได้เหมือนเดิมไม๊ครับ
หรือรับได้ทั้ง ค่าที่ใส่เข้าไป และ ค่าที่เป็น shortcode ครับ
|
|
|
|
|
Date :
2021-01-13 16:43:42 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ที่ว่า pvcp_website_count ส่งออกมาเป็น 300 ผมว่าลองเช็คดูดีๆก่อน อาจจะเป็นค่าค้างเติ่งจากอะไรสักอย่างมากกว่า
ลองง่ายๆ ให้ฟังก์ชั่นที่รัน shortcode pvcp_website_count ส่งตัวเลขออกมาพร้อมข้อความ เช่น return 'pvcp123pvcp';
Code (PHP)
add_shortcode('pvcp_website_count', function() {return 'pvcp123pvcp';});
แบบนี้จะได้รู้ไปเลยว่ามันใช่ไหม ถ้าไม่มีตัวหนังสือคร่อมตัวเลขแบบนี้แสดงว่ามาจากอันอื่นครับ.
จริงๆควรเขียนปลั๊กอินขึ้นมาอีกอัน เพื่อกระเทาะเข้าไปที่ตัวปัญหาเลย คือการแปลง shortcode แบบซ้อนกัน มากกว่าที่จะมาไล่แก้ในงานจริงเพราะโค้ดมันใหญ่และเยอะ การหาข้อผิดพลาดมันยากกว่า
ทำแบบผมมันจะไล่หาต้นตอง่าย ทดสอบง่าย ถ้าทดสอบแล้วได้ค่อย วก กลับ ไปหางานจริงอีกที
|
ประวัติการแก้ไข 2021-01-13 18:19:32
|
|
|
|
Date :
2021-01-13 18:18:45 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 9 เขียนโดย : lakornworld เมื่อวันที่ 2021-01-13 17:19:26
รายละเอียดของการตอบ ::
ผมขอเวลาศึกษาโค้ด ซักพักนะครับ
ยังมึนๆกับโค้ด และ ภาษา php กับ wordpress อยู่เลย
เรื่องเว็บผม blank เลยครับ
ได้แค่งูๆปลาๆ อาจจะต้องแกธโค้ดซักพักเพื่อไล่เช็คตามอีกทีครับ
ตอบความคิดเห็นที่ : 10 เขียนโดย : mr.v เมื่อวันที่ 2021-01-13 18:10:41
รายละเอียดของการตอบ ::
มันน่าจะมีนะครับ แต่ผมมีความรู้เรื่องเว็บน้อย อธิบายน่าจะยาก
แต่สิ่งที่มอง หรือที่ผมอยากได้คือ
ใน page-visit-counter.php มันมี function page_visit_counter_md_total_sites_visit() ไว้ดึงค่าผู้เยี่ยมชมอยู่
เพียงแค่ผมไม่รู้ว่า stm_counter.php มันจะดึงมาได้ยังไง
ความรู้ผมตอนนี้ ลำพังมันอยู่โฟลเดอร์เดียวกัน ไม่ได้อยู่ไฟล์เดียว ก็ ยังไม่รู้เลยครับว่าจะเรียกมาใช้ยังไง
แต่นี่มันอยู่คนละโฟลเดอร์ด้วย
แต่เดี๋ยวลองแกะๆโค้ด ไปก่อน เรียนรู้ซักหน่อย ค่อยมา ถามอีกรอบละครับ
ให้ผมได้มีความรู้พอให้คุยรู้เรื่องหน่อย เวลาพูดจะได้เป็นทิศทางเดียวกัน
ตอบความคิดเห็นที่ : 11 เขียนโดย : mr.v เมื่อวันที่ 2021-01-13 18:18:45
รายละเอียดของการตอบ ::
ตัว 300 หายไปแล้วครับ น่าจะค้างจากค่าเดิมอยู่มั้งครับ
|
|
|
|
|
Date :
2021-01-13 20:13:57 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
shortcode มันประมวลผลโดย wordpress
ทาง wp จะเป็นฝ่ายจับ shortcode มาให้เรา ไม่ใช่เราไปทำเอง
และค่า shortcode ใน attribute มันมาไม่ครบ ตัวอย่าง [foo] จะมาแค่ [foo ดังนั้นจะทำยังไงก็ไม่มีทางแปลง shortcode แบบนี้ได้
และทาง wordpress ก็บอกเองว่าไม่รองรับ square bracket ใน attribute ตามเว็บของเขาและที่ผมก็อปมาแปะให้ ไม่ทราบว่าคุณได้อ่านหรือเปล่า?
เพราะถ้าอ่านแล้ว เขาบอกว่าไม่ได้ คุณว่าน่าจะได้ก็ไม่รู้แล้วครับ เจ้าของเขายังว่าไม่ได้เลย
ผมหาใน google ก็ไม่มีใครทำได้ทั้งนั้น ถ้าทำได้ทั้งที่เขายังไม่อัพเดทโค้ด ก็คงเป็นคนแรกในโลกก็ว่าได้ top of the world?
|
|
|
|
|
Date :
2021-01-13 20:37:01 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมไม่เข้าใจ ตกลงว่าตอนนี้คือปัญหาอะไรกันแน่?
หัวกระทู้บอกลง shortcode แล้วไม่แสดงผล
สาเหตุของมันคือใช้ square bracket [...] ข้างใน shortcode attribute ไม่ได้ ซึ่งทาง wordpress ก็บอกเองว่าไม่ได้
เพราะเมื่อลงโค้ดอย่างเช่น [foo name=[bar] name2="aaa"] มันจะได้ attribute ที่มีค่าแค่
name => [bar,
name2 => aaa
แล้วจะไปอ้างถึงฟังก์ชั่นอื่นๆนี่คืออะไร? ปัญหาจริงๆคืออะไร? เอา shortcode มาได้ทั้งดุ้น ([bar]) แล้วหรือ?
ถ้าเอาตามหัวกระทู้ ทางแก้ปัญหาคือใช้ nest ให้ถูก แบบนี้
[foo attribute="value"]
[bar]
[/foo]
และมันก็ไม่เห็นว่าจะเกี่ยวกับฟังก์ชั่นนู้นเปลี่ยนเป็นนั้นตรงไหนเลย???
|
ประวัติการแก้ไข 2021-01-13 22:27:40
|
|
|
|
Date :
2021-01-13 22:25:46 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แนวทางที่ 2 ผมทดลองเขียนปลั๊กอินขึ้นมาเพื่อทดสอบแล้ว ทำงานได้ โค้ดแบบนี้
Code (PHP)
<?php
/**
* Plugin Name: EXP plugin
* Plugin URI:
* Description:
* Author: Vee W
* Version: 0.1a
* Text Domain: expplug
* License:
* License URI:
*/
add_shortcode('pvcp_website_count', 'expPlugDisplayCounter');
// ข้างล่างนี่ เพิ่มเข้ามารองรับ [custom_attribute_shortcode_pvcp_website_count] ที่ถูกแปลงจาก {custom_attribute_shortcode_pvcp_website_count}
add_shortcode('custom_attribute_shortcode_pvcp_website_count', 'expPlugDisplayCounter');
function expPlugDisplayCounter($atts)
{
return '<span class="bg-dark text-info">251</span>' . PHP_EOL;
}
add_shortcode('stm_counter', 'expPlugCounterWrapper');
function expPlugCounterWrapper($atts, $content = '', $shortcode_tag = '')
{
$output = '<div class="card">' . PHP_EOL;
$output .= ' <div class="card-body"';
if (is_array($atts)) {
foreach ($atts as $attName => $attVal) {
if ('{custom_attribute_shortcode_pvcp_website_count}' === $attVal) {
// ถ้าเจอ {custom_attribute_shortcode_pvcp_website_count}
// ให้แปลงเป็น [custom_attribute_shortcode_pvcp_website_count] เพื่อแปลง shortcode อีกที
$attVal = str_replace(['{', '}'], ['[', ']'], $attVal);
$attVal = do_shortcode($attVal);
if (!empty($attVal)) {
// ถ้าแปลงสำเร็จ
// กำหนดค่า content เพื่อแสดงผล (ของจริงต้องทำไงก็แก้เอาเอง)
$content = $attVal;
// แล้วข้าม loop นี้ไปเพราะไม่ใช่ที่ต้องการ.
continue;
}
}
$output .= ' data-' . strip_tags($attName) . '="' . esc_attr($attVal) . '"';
}
}
$output .= '>' . PHP_EOL;// close card-body element.
if (!empty($content)) {
$output .= do_shortcode($content) . PHP_EOL;
} else {
$output .= ' <em>This shortcode has no content.</em>' . PHP_EOL;
}
$output .= ' </div><!-- .card-body -->' . PHP_EOL;
$output .= '</div><!-- .card -->' . PHP_EOL;
return $output;
}
add_shortcode('wrapshortcode', 'expPluginWrapShortcode');
function expPluginWrapShortcode($atts, $content = '', $shortcode_tag = '')
{
$output = '<div class="card text-white bg-primary mt-3">' . PHP_EOL;
$output .= ' <div class="card-header">wrap shortcode</div>' . PHP_EOL;
$output .= ' <div class="card-body"';
if (is_array($atts)) {
foreach ($atts as $attName => $attVal) {
$output .= ' data-' . strip_tags($attName) . '="' . esc_attr($attVal) . '"';
}
}
$output .= '>' . PHP_EOL;// close card-body element.
if (!empty($content)) {
$content = apply_filters('the_content', $content);
$output .= do_shortcode($content) . PHP_EOL;
} else {
$output .= ' <em>This shortcode has no content.<em>' . PHP_EOL;
}
$output .= ' </div><!-- .card-body -->' . PHP_EOL;
$output .= '</div><!-- .card -->' . PHP_EOL;
return $output;
}
เนื้อหาในโพสต์จะเป็นแบบนี้
Code
<p>Test shortcode.</p>
<p><code>stm_counter</code> only.<br />
[stm_counter something="somewhere" icon_width="100"]</p>
<p><code>pvcp_website_count</code> only.<br />
[pvcp_website_count]</p>
<p><code>stm_counter</code> with <code>pvcp_website_count</code> as attribute.<br />
[stm_counter [pvcp_website_count] icon_width="100"]<br>
[stm_counter someattribute=[pvcp_website_count] icon_width="100"]</p>
<p><code>wrapshortcode</code> that wrap <code>pvcp_website_count</code> inside.<br />
[wrapshortcode][pvcp_website_count][/wrapshortcode]</p>
<p><code>stm_counter</code> as custom shortcode using curly bracket <code>{...}</code> instead of square bracket <code>[...]</code>.<br>
[stm_counter {custom_attribute_shortcode_pvcp_website_count} icon_width="100"]</p>
ที่เหลือคุณก็ทำความเข้าใจ ทดลองสร้างปลั๊กอินขึ้นมาเพื่อดูว่ามันทำงานได้จริง โดยปิดส่วนอื่นๆไปก่อนให้มีแค่ปลั๊กอินนี้
พอทำงานได้แล้วค่อยเอาไปใส่ในงานจริง จะในธีมหรืออะไรก็ว่าไป แกะโค้ดเอาเอง มาถึงขนาดนี้แล้วไม่ยากหรอก
|
ประวัติการแก้ไข 2021-01-13 23:17:58
|
|
|
|
Date :
2021-01-13 23:16:17 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณมากๆครับ
ขอรบกวนอีกนิดหนึ่ง(อาจจะเยออะะหน่อย)
ยังไงให้ XAMP มีข้อมูลตรงกัน ครับ
คือ ผมมีเครื่องที่บ้าน และ เครื่องที่ทำงาน ลง xamp ไว้ที่ C:\xampp ทั้งคู่
เมื่อก่อนผมใช้วิธี ก๊อบไฟล์ทั้งหมดมาลง
อยากทราบว่า ปกติกันยังไง หรือมีวิธียังไงให้ xamp 2 เครื่องมันมีข้อมูลเดียวกัน เพื่อให้เราทำงานได้ต่อเนื่อง ครับ
|
|
|
|
|
Date :
2021-01-13 23:28:52 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
คุณไม่เคยใช้ Git, GitHub, GitLab อะไรพวกนี้เลยเหรอ?
คุณจะไปลากทั้ง folder Xampp ทำไม?
Xampp หรืออะไรก็ตาม Uwamp, Wamp, แม้แต่ลงเอง IIS Apache มันเป็นแค่ web server + PHP + MySQL (MariaDB)
จะลงเครื่องไหนลงยี่ห้ออะไรก็ช่าง ขอแค่รุ่น PHP ที่จะใช้ให้มันตรงกัน มี extension ของ PHP ที่ต้องการครบถ้วนก็พอ
ตัวงานจริงๆที่คุณทำมันไม่ได้เกี่ยวอะไรกับ Xampp เลยแม้แต่น้อย
ไม่งั้นจะอัพขึ้น server จริงไม่ต้องหาเช่า vps Windows เพื่อลง Xampp วุ่นวายตายชักหรือ?
ตัวงานจริงๆมันอยู่ในโฟลเดอร์ไหน คุณก็เข้าไปตรงนั้น ทำการเรียก git อย่างที่ผมบอก
ต่อให้ที่ทำงานใช้ Linux ก็ช่าง พอทำเสร็จก็ commit & push กลับขึ้นไป
พอมาอีกเครื่องก็แค่ pull ลงมา มันก็แค่นี้เอง ไม่ต้องไปวุ่นวายกับ Google Drive ด้วย
ส่วนปัญหา DB จะให้ sync ก็ต้องศึกษาเพิ่มว่าเขาทำกันยังไง เพราะปกติผมไม่ได้ทำ ในเครื่อง development ทั้งหลายที่ผมใช้ ผมแค่มีตารางให้ตรง นอกนั้นข้อมูลก็ generate เอา แค่นั้น. ส่วนบน server จริงก็คอย backup เอา
อีกอย่างหนึ่ง เรื่องการอัพเดท "โครงสร้าง" ต่างๆใน DB พยายามศึกษาเรื่องการใช้ migration เพิ่มเติม
อย่างของผมใช้ Phinx https://phinx.org/ ซึ่งผมก็พ่วงไว้ในคำสั่ง update เลย (ใน framework ของผมเอง) พอทำการ pull ลงมาเสร็จ สั่งอัพเดทโมดูล มันจะทำการ migration update DB ให้เลยในทีเดียว
แต่ถ้าจะเอาพวกข้อมูลด้วย อันนี้คงจะยากและงานใหญ่. แต่อย่างที่บอก เครื่อง development ใช้ generate ข้อมูลเอาก็พอแล้ว ไม่เห็นต้องไปลากไปลากมาให้หนัก
|
|
|
|
|
Date :
2021-01-14 08:48:18 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
สำหรับวิธีการแก้ปัญหาของ จขกท. 1 ในวิธีเลี่ยง (จากหลายวิธี)
1. ใส่ shortcode โดยไม่มี square brackets
Code
[tag attr=shortcode]
2. ทำ Custom Hooks หรือแก้โค้ดแบบ hardcore ใน stm-counter(อยู่ใน theme) เพื่อให้รองรับ counter-value แบบ string แล้วดึงข้อมูลตัวเลขจากฐานข้อมูล (หรือใช้ do_shortcode()) ออกมาแสดงโดยตรง (หลังจากแก้โค้ดต้องไปปิด auto-update theme หรือ ถ้าไม่มีฟังก์ชันนี้ก็แค่ไม่ต้องอัปเดตเพราะโค้ดที่แก้ใน core จะหายหลังมีการอัปเดต...จึงควรสำรองไฟล์ไว้ด้วย)
stm_counter.php
<?php
global $wp_filesystem;
if ( empty( $wp_filesystem ) ) {
require_once ABSPATH . '/wp-admin/includes/file.php';
WP_Filesystem();
}
$atts = vc_map_get_attributes( $this->getShortcode(), $atts );
extract( $atts );
$css_class = apply_filters( VC_SHORTCODE_CUSTOM_CSS_FILTER_TAG, vc_shortcode_custom_css_class( $css, ' ' ) );
if( $el_class ){
$css_class = ' ' . $el_class;
}
if ( ! wp_is_mobile() ) {
wp_enqueue_script( 'countUp' );
wp_enqueue_script( 'jquery.appear' );
if( $drawing ){
wp_enqueue_script( 'vivus' );
}
}
$counter_id = uniqid( 'counter_' );
$icon_div_id = uniqid( 'icon_wr_' );
$icon_id = uniqid( 'icon_' );
$icon_style = array();
$title_style = array();
if( $icon_color ){
$icon_style['color'] = 'color: ' . $icon_color . ';';
}
if( $icon_width ){
$icon_style['width'] = 'width: ' . $icon_width . 'px;';
}
if( $icon_size ){
$icon_style['font-size'] = 'font-size: ' . $icon_size . 'px;';
}
if( $font_color ){
$title_style['color'] = 'color: ' . $font_color . ';';
}
?>
<?php if( $counter_value ): ?>
// hook: do_action() หรือถ้ายังไม่มีความรู้เรื่องนี้ พิมพ์โค้ดเพิ่มไปเลย โดยเช็คค่า $counter_value แล้วสร้างเงื่อนไขกรองตัวเลขกับ string
// action/hardcore area เช่น
// <?php
// $new_counter_value = 0;
// if( is_numeric($counter_value) ) {
// $new_counter_value = $counter_value;
// } else {
// // ดึงตัวเลขจากฐานข้อมูลด้วย global $wpdb หรือใช้ do_shortcode()
// // ...
// $new_counter_value = ...;
// }
// ?>
// จากนั้น แทน $counter_value ด้วย $new_counter_value ใน template ข้างล่าง
<div class="stm_counter<?php echo esc_attr( $css_class ); ?>">
<?php if( $icon ): ?>
<div class="icon"<?php echo( ( $icon_style ) ? ' style="' . esc_attr( implode( ' ', $icon_style ) ) . '"' : '' ); ?>>
<i class="<?php echo esc_attr( $icon ); ?>"></i>
</div>
<?php elseif( $drawing_icon ): ?>
<div id="<?php echo esc_attr( $icon_div_id ); ?>" class="icon"<?php echo( ( $icon_style ) ? ' style="' . esc_attr( implode( ' ', $icon_style ) ) . '"' : '' ); ?>>
<?php echo $wp_filesystem->get_contents( get_template_directory() . '/assets/images/drawing_icons/' . esc_attr( $drawing_icon ) . '.svg' ); ?>
</div>
<?php endif; ?>
<div class="text">
<?php if ( wp_is_mobile() ) { ?>
<div class="value"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?> id="<?php echo esc_attr( $counter_id ); ?>"><?php echo esc_attr( $counter_value_pre ); ?><?php echo esc_attr( $counter_value ); ?><?php echo esc_attr( $counter_value_suf ); ?></div>
<?php } else { ?>
<div class="value"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?> id="<?php echo esc_attr( $counter_id ); ?>"></div>
<?php } ?>
<?php if ( $title ) { ?>
<div class="title"<?php echo( ( $title_style ) ? ' style="' . esc_attr( implode( ' ', $title_style ) ) . '"' : '' ); ?>><?php echo wp_kses_post( $title ); ?></div>
<?php } ?>
</div>
</div>
<?php if( $drawing_icon ): ?>
<style type="text/css" scoped>
<?php echo "#" . $icon_id; ?>{
<?php
if( $icon_size ){
echo "height: " . esc_attr( $icon_size ) . "px;\n";
}
if( $icon_width_svg ){
echo "width: " . esc_attr( $icon_width_svg ) . "px;\n";
}
if( $icon_color ){
echo "stroke: " . esc_attr( $icon_color ) . ";\n";
}
?>
}
</style>
<?php endif; ?>
<script type="text/javascript">
jQuery(document).ready(function ($) {
$("#<?php echo esc_js( $icon_div_id ); ?> svg").attr( 'id', '<?php echo esc_js( $icon_id ); ?>' );
<?php if ( ! wp_is_mobile() ): ?>
var <?php echo esc_js( $counter_id ); ?> = new countUp("<?php echo esc_js( $counter_id ); ?>", 0, <?php echo esc_js( $counter_value ); ?>, 0, <?php echo esc_js( $duration ); ?>, {
useEasing: true,
useGrouping: false,
prefix : '<?php echo esc_attr( $counter_value_pre ); ?>',
suffix : '<?php echo esc_attr( $counter_value_suf ); ?>'
});
var inited = false;
$("#<?php echo esc_js( $counter_id ); ?>").appear({ force_process: true });
$("#<?php echo esc_js( $counter_id ); ?>").on('appear', function () {
if (!inited) {
<?php echo esc_js( $counter_id ); ?>.start();
inited = true;
}
});
<?php if( $drawing_icon ): ?>
new Vivus('<?php echo esc_js( $icon_id ); ?>', {
type: 'async',
duration: 150,
animTimingFunction: Vivus['EASE_OUT']
});
<?php endif; ?>
<?php endif; ?>
});
</script>
<?php endif; ?>
|
|
|
|
|
Date :
2021-01-17 13:38:57 |
By :
lakornworld |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
นั่งยัน นอนยัน shortcode in attribute ทดสอบผ่าน "the_content" hook
[pvcp_website_count]
Total Website Visits: 8
[siteview title="Test" cv="[pvcp_website_count]"]
TEST
Total Website Visits: 8
[siteview cv="[pvcp_website_count]"]
LAKORNWORLD
Total Website Visits: 8
[siteview cv="[pvcp_website_count]" title="Test"]
TEST
Total Website Visits: 8
[siteview title="Test" cv=[pvcp_website_count]]
TEST
Total Website Visits: 8
[siteview cv=[pvcp_website_count]]
LAKORNWORLD
Total Website Visits: 8
[siteview cv=[pvcp_website_count] title="Test"]
TEST
Total Website Visits: 8
[siteview title="Test" cv=[pvcp_website_count]
”TEST”
Total Website Visits: 8
[siteview cv=[pvcp_website_count]
LAKORNWORLD
Total Website Visits: 8
[siteview cv=[pvcp_website_count title="Test"]
TEST
Total Website Visits: 8
[siteview cv=pvcp_website_count]
LAKORNWORLD
Total Website Visits: 8
บน input / ล่าง results
จำลองงานจริง
shortcode input
Quote:[vc_row full_width="stretch_row" css=".vc_custom_1450270522171{margin-bottom: 0px !important;padding-top: 40px !important;padding-bottom: 14px !important;}" el_class="secondary_bg_color"][vc_column width="1/2" offset="vc_col-lg-3 vc_col-md-3" css=".vc_custom_1449142338264{margin-bottom: 30px !important;}"][stm_counter counter_value="320" drawing="yes" icon_width_svg="65" icon_size="64" title="Projects Done" drawing_icon="stm-projects-done" icon_color="#ffffff"][/vc_column][vc_column width="1/2" offset="vc_col-lg-3 vc_col-md-3" css=".vc_custom_1449142329000{margin-bottom: 30px !important;}"][stm_counter counter_value="72" drawing="yes" icon_width_svg="64" icon_size="68" title="Clients Worldwide" drawing_icon="stm-clients-worldwide" icon_color="#ffffff"][/vc_column][vc_column width="1/2" offset="vc_col-lg-3 vc_col-md-3" css=".vc_custom_1449142343672{margin-bottom: 30px !important;}"][stm_counter counter_value="153" drawing="yes" icon_width="80" icon_width_svg="52" icon_size="67" title="Owned Vehicles" drawing_icon="stm-owned-vehicles" icon_color="#ffffff"][/vc_column][vc_column width="1/2" offset="vc_col-lg-3 vc_col-md-3" css=".vc_custom_1449142350247{margin-bottom: 30px !important;}"][stm_counter counter_value="[pvcp_website_count]" drawing="yes" icon_width="100" icon_width_svg="68" icon_size="67" title="Visits" drawing_icon="stm-people-in-team" icon_color="#ffffff"][/vc_column][/vc_row]
results
ส่วนอันนี้เป็น plugin หยาบ ที่ผมเขียนขึ้นมาเพื่อ test กรณี "shortcode in attribute fail" เท่านั้น (และแก้ปัญหาได้ตามผลด้านบน)
site-view.php
<?php
/**
* Plugin Name: Site View
* Plugin URI: https://lakornworld.com/plugins/site-view/
* Description: Handle shortcode inside shortcode's attribute
* Version: 1.0
* Requires at least: 5.2
* Requires PHP: 7.2
* Author: LakornWorld
* Author URI: https://lakornworld.com/
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: lsv
* Domain Path: /languages
*/
function lsv_shortcode( $atts = [], $content = null, $tag = '' ) {
// normalize attribute keys, lowercase
$atts = array_change_key_case( (array) $atts, CASE_LOWER );
// override default attributes with user attributes
$lsv_atts = shortcode_atts(
array(
'title' => 'LakornWorld',
'cv' => '',
), $atts, $tag
);
/* Uncomment below line to see all user attribute values */
// echo '<pre>' . print_r($lsv_atts, 1) . '</pre>';
// start box
$o = '<div class="stm-counter">';
// title
$o .= '<h2>' . esc_html__( $lsv_atts['title'], 'lsv' ) . '</h2>';
// cv
$lsv_shortcode = (strpos($lsv_atts['cv'], '[') === false ? '[' : '') . $lsv_atts['cv'] . ']';
$cv = do_shortcode($lsv_shortcode);
$o .= $cv;
// enclosing tags
if ( ! is_null( $content ) ) {
// secure output by executing the_content filter hook on $content
$o .= apply_filters( 'the_content', $content );
// run shortcode parser recursively
$o .= do_shortcode( $content );
}
// end box
$o .= '</div>';
// return output
return $o;
}
function lsv_shortcode_parse_atts( $content ) {
// Check if we're inside the main loop in a Page.
if ( is_page() && in_the_loop() && is_main_query() ) {
/* Uncomment to see the original content of posted page (=> before change) */
// echo $content;
$lsv_search = ['"[', ']"'];
$content = str_replace($lsv_search, "", $content);
$lsv_pattern = ["/=\[(.+?)\]\]/", "/=\[(.+?)\](\h\w)/"];
$content = preg_replace($lsv_pattern, ["=$1]", "=$1$2"], $content);
/* Uncomment to see the results after parsing page's content (=> after change) */
// echo $content;
return $content;
}
return $content;
}
/**
* Central location to create all shortcodes.
*/
function lsv_shortcodes_init() {
add_shortcode( 'siteview', 'lsv_shortcode' );
add_filter( 'the_content', 'lsv_shortcode_parse_atts', -1 );
}
add_action( 'init', 'lsv_shortcodes_init' );
|
ประวัติการแก้ไข 2021-01-17 18:11:57 2021-01-17 18:14:25 2021-01-17 18:22:50
|
|
|
|
Date :
2021-01-17 18:10:38 |
By :
lakornworld |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 03
|