Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > PHP > PHP Forum > Wordpress+ php ผมดึงค่ามาจาก Page Visit Counter ใส่ใน stm_counter แล้ว Error ครับ



 

Wordpress+ php ผมดึงค่ามาจาก Page Visit Counter ใส่ใน stm_counter แล้ว Error ครับ

 



Topic : 135830



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook



5


6

จากรูปถ้าเอาไปใส่ใน 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'             =&gt; '4453',
                'slug'           =&gt; 'page-visit-counter',
                'type'           =&gt; 'plugin',
                'public_key'     =&gt; 
'pk_e7705ac1700ddfca594652ad4470e',
                'is_premium'     =&gt; false,
                'premium_suffix' =&gt; 'Pro',
                'has_addons'     =&gt; false,
                'has_paid_plans' =&gt; true,
                'menu'           =&gt; array(
                'slug'       =&gt; 'pvcp-get-started',
                'first-path' =&gt; 'admin.php?page=pvcp-get-started',
                'contact'    =&gt; false,
                'support'    =&gt; false,
            ),
                'is_live'        =&gt; 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-&gt;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-&gt;get_results( $wpdb-&gt;prepare( "SELECT 
wizard_setting,status FROM {$wpdb-&gt;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]-&gt;wizard_setting 
);
    // get individual wizard status
    $page_status = $wzResult[0]-&gt;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 &amp;&amp; (empty($page_meta_value) || 
in_array( 'yes', $page_meta_value )) &amp;&amp; 
(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'] ) &amp;&amp; 
!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'] ) &amp;&amp;
 !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-&gt;get_var( $wpdb-&gt;prepare( "SELECT 
count(*) FROM {$wpdb-&gt;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-&gt;get_var( "SELECT count(*) FROM {$wpdb-&gt;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







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2021-01-13 11:09:38 By : lamaka.tor View : 1158 Reply : 27
 

 

No. 1



โพสกระทู้ ( 210 )
บทความ ( 0 )



สถานะออฟไลน์


feedback จาก .NET ผมขออนุญาตนำมาแปะไว้ใน PHP นะครับ

Quote:
ตอนนี้ก็มาจับ php อ่านดู แต่ดูเหมือนเนื้อหาพื้นฐาน ไม่ค่อยช่วยอะไรได้มากนักครับ เพราะ โค้ดต้นฉบับ ที่เขาเขียนไว้ยากพอสมควร


WordPress
ในมุม user - อาจง่ายสำหรับมือใหม่ เพราะมีการ interacting แบบ Drag&Drop/Edit/Publish...ส่วนใหญ่ผู้ใช้โหลดหรือซื้อ theme มาแก้ไข content ความรู้ PHP จึงไม่ค่อยได้ใช้แต่สิ่งที่ได้ใช้จะเป็นพื้นฐาน HTML, JS, CSS เพื่อจัดตำแหน่งเลเอาต์ เทมเพลต และตกแต่งความงามตามธีม

ในมุม developer - จัดอยู่ใน intermediate-advanced level เพราะ WordPress เป็น CMS มีทั้ง system, framework, plugin,...ต่างๆ นาๆ เป็นของตัวเอง จึงไม่ใช่แค่ความรู้พื้นฐานแต่ยังต้องสามารถพลิกแพลงและประยุกต์ใช้ PHP ได้ บวกกับต้องศึกษารูปแบบและฟังก์ชันการทำงานของ WordPress ให้เข้าใจจึงจะสามารถแยกและวิเคราะห์ปัญหาที่พบได้


ด้วยเหตุนี้โค้ดที่นำมายังไม่การันตีความถูกต้องของการวิเคราะห์นี้ เนื่องจากอาจมี reference ที่เกี่ยวโยงจากไฟล์อื่นด้วย แต่เบื้องต้นเท่าที่เห็น

1. สังเกตจากตัวอย่างที่แสดงในคอลัมน์ก่อนหน้า ค่าการนับใช้ attribute ชื่อ counter_value ดังนั้น ใน WordPress editor
Code
[stm_counter counter_value=[pvcp_website_count] icon_width="100" ...]


2. แต่การแก้ปัญหาใน 1. อาจไม่ได้ผลเพราะ stm_counter และ pvcp_website_count ต่างก็เป็น shortcode ซึ่งใช้เครื่องหมาย [] การวาง shortcode ซ้อนกัน เรียกว่า "Nested Shortcodes" ก่อนจะใช้ Nested ได้ต้อง implement แบบ recursive ด้วยฟังก์ชัน do_shortcode() แต่ดูจากโค้ดที่เอามาแปะไม่มี(แต่ก็ไม่แน่เพราะอาจมีในไฟล์อื่นจาก file references อย่างที่กล่าวไปแล้ว)...

จุดสังเกต ถ้ามีการเรียกแบบ recursive จะสามารถใช้ Nested/Complex Shortcodes ได้ เช่น

Code
[shortcode_level1 attr1=[shortcode_level2] attr2=[shortcode_level2]]


หรือ

Code
[short1] [short2] [short3 attr="value"] [/short2] [/short1]


แสดงว่า จากตัวอย่าง visual composer row/column มีการ implement แบบ recursive เอาไว้ (vc_column ซ้อนใน vc_row และ stm_counter ใน vc_column)

ดังนั้น ถ้าอยากให้การแก้ปัญหาข้อ 1 สัมฤทธิ์ผลให้ได้ (กรณีไม่แสดง) ก็เรียก/คืนค่าด้วย do_shortcode() ในฟังก์ชัน stm_counter

https://codex.wordpress.org/Shortcode_API


ลองดูครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 12:41:44 By : lakornworld
 


 

No. 2



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


error ว่าอะไร?


เพิ่มเติม: ติดตั้ง debug plugin บนเครื่อง development (localhost) แล้วดูรายละเอียด


ประวัติการแก้ไข
2021-01-13 13:37:19
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 13:36:58 By : mr.v
 

 

No. 3



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 2 เขียนโดย : mr.v เมื่อวันที่ 2021-01-13 13:36:58
รายละเอียดของการตอบ ::
ไม่มี Error ครับ แค่มันไม่ขึ้นค่า ดังรูปครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 14:30:15 By : lamaka.tor
 


 

No. 4



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 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
 


 

No. 5



โพสกระทู้ ( 210 )
บทความ ( 0 )



สถานะออฟไลน์


ไฟล์/ส่วน ที่แก้ไขไม่ใช่ฟังก์ชันของ shortcode ครับ

การลงทะเบียน shortcode จะทำผ่านฟังก์ชัน add_shortcode()

syntax
add_shortcode( 'shortcode_name', 'shortcode_handler' );



โดยที่พารามิเตอร์สองเป็น callback function หรือส่วนที่เราต้องไปแก้ไข
ในกรณีนี้ shortcode เป้าหมายคือ stm_counter ดังนั้น ลองค้นหาด้วย


add_shortcode( 'stm_counter', 'xxx' );


xxx คือ function callback ของ shortcode ที่เราต้องการ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 15:32:30 By : lakornworld
 


 

No. 6



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 5 เขียนโดย : lakornworld เมื่อวันที่ 2021-01-13 15:32:30
รายละเอียดของการตอบ ::
ในกรณี ที่อยู่คนละ โฟลเดอร์
ตัว stm_counter.php อยู่ใน

\wp-content\themes\transcargo\vc_templates

ส่วนตัว page-visit-counter.php อยู่ใน

\wp-content\plugins\page-visit-counter

ผมจะ implement จาก page-visit-counter.php เพื่อดึงค่า pvcp_website_count มายัง stm_counter.php ได้ยังไง ครับ


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 15:42:40 By : lamaka.tor
 


 

No. 7



โพสกระทู้ ( 210 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 6 เขียนโดย : lamaka.tor เมื่อวันที่ 2021-01-13 15:42:40
รายละเอียดของการตอบ ::
จากโครงสร้างโฟลเดอร์ทำให้รู้ว่า stm_counter อยู่ในธีม
page-visit-counter เป็น plugin

WP เป็นแอปพลิเคชันแบบโครงสร้าง (structured flow) ดังนั้น เมื่อเราติดตั้งและ enable plugin ใน theme ใด theme นั้นจะสามารถสื่อสารกับ plugin ได้เอง

ส่วนที่ต้องทำคือหา(search in files) ฟังก์ชันของ shortcode ใน theme แล้วไปแก้ไข callback ก็จะสามารถ post ใน editor ตามข้อ 1 #1 ได้ครับ


ตัวอย่างการ implement Nested Shortcode


Code (PHP)
add_shortcode("my_text", "my_text");
function my_text() {
    return 'nested shortcode';
}
 
function my_link($atts, $content = null) {
    extract(shortcode_atts(array(
        "href" => 'http://'
    ), $atts));

    return '<a href="'.$href.'">'.do_shortcode($content).'</a>';   // การคืนค่าให้ใส่ do_shortcode()
    
    // ถ้าเปลี่ยนเป็น
    // return '<a href="'.$href.'">'.$content.'</a>';   // link shortcode จะไม่รองรับ Nested

}
add_shortcode("link", "my_link");




ประวัติการแก้ไข
2021-01-13 16:20:05
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 16:01:43 By : lakornworld
 


 

No. 8



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 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
 


 

No. 9



โพสกระทู้ ( 210 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 8 เขียนโดย : lamaka.tor เมื่อวันที่ 2021-01-13 16:43:42
รายละเอียดของการตอบ ::
1. หมายถึง การทำงานร่วมกันโดยไม่ต้องแก้โค้ดส่วนอื่น (นอกจากที่บอกไปแล้ว)

2. shortcode คือ ตัวแปรใน plain-text editor ถ้าสามารถใช้ Nested ได้ ก็ไม่จำเป็นต้องแก้ theme-core(ซึ่งโดยทั่วไปถ้าไม่ได้ develop theme จะไม่แก้ core แต่จะทำเป็น child theme...อารมณ์คล้าย child form ของ .NET) การทำงานส่วนอื่นก็ปกติเหมือนเดิม

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 17:19:26 By : lakornworld
 


 

No. 10



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


https://codex.wordpress.org/Shortcode_API#Square_Brackets
มันไม่น่าจะทำได้มั้งครับ shortcode ใน attribute.

Quote:
The shortcode parser does not accept square brackets within attributes. Thus the following will fail:

[tag attribute="[Some value]"]

Tags surrounded by cosmetic brackets are not yet fully supported by wptexturize() or its filters. These codes may give unexpected results:

[I put random text near my captions. [caption]]

Note: these limitations may change in future versions of WordPress, you should test to be absolutely sure.



ตัวอย่างที่ผมลองทำดูมันก็ไม่เห็นจะได้เหมือนกัน.
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');
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) {
            $output .= ' data-' . strip_tags($attName) . '="' . do_shortcode($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(do_shortcode($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 somevalue="[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>


ออกมาเป็น
Code
<p>Test shortcode.</p> <p><code>stm_counter</code> only.<br /> <div class="card"> <div class="card-body" data-something="somewhere" data-icon_width="100"> <em>This shortcode has no content.</em> </div><!-- .card-body --> </div><!-- .card --> </p> <p><code>pvcp_website_count</code> only.<br /> <span class="bg-dark text-info">251</span> </p> <p><code>stm_counter</code> with <code>pvcp_website_count</code> as attribute.<br /> <div class="card"> <div class="card-body" data-somevalue="&#8221;[pvcp_website_count"> <em>This shortcode has no content.</em> </div><!-- .card-body --> </div><!-- .card --> &#8221; icon_width=&#8221;100&#8243;]</p> <p><code>wrapshortcode</code> that wrap <code>pvcp_website_count</code> inside.<br /> <div class="card text-white bg-primary mt-3"> <div class="card-header">wrap shortcode</div> <div class="card-body"> <span class="bg-dark text-info">251</span> </div><!-- .card-body --> </div><!-- .card --> </p>



ประวัติการแก้ไข
2021-01-13 18:13:03
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 18:10:41 By : mr.v
 


 

No. 11



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


ที่ว่า 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
 


 

No. 12



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 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
 


 

No. 13



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


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
 


 

No. 14



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 13 เขียนโดย : mr.v เมื่อวันที่ 2021-01-13 20:37:01
รายละเอียดของการตอบ ::
ผมจะไม่ดึง page_visit_counter มาแล้วนะครับ แต่จะดึง function page_visit_counter_md_total_sites_visit() มาใช้เลย แบบนี้ได้ไม๊ครับ

ไม่งั้น ถ้าผมจะลอง ดึงไฟล์ page-visit-counter.php และ ไฟล์ต่างๆที่เกี่ยวข้องกับมัน มาลงใน โฟลเดอร์เดียวกับ ทีม
แบบนี้มันจะดึง function page_visit_counter_md_total_sites_visit() มาใช้เลย แบบนี้ได้ไม๊ครับ



แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 21:00:59 By : lamaka.tor
 


 

No. 15



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


ผมไม่เข้าใจ ตกลงว่าตอนนี้คือปัญหาอะไรกันแน่?


หัวกระทู้บอกลง 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
 


 

No. 16



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 10 เขียนโดย : mr.v เมื่อวันที่ 2021-01-13 18:10:41
รายละเอียดของการตอบ ::
ขอสอบถามครับ ในกรณีที่เราอยากทดสอบ ไฟล์ .php อย่างที่ทำใน No. 10
เราจำเป็นสร้างไฟล์ .html ในโฟลเดอร์เดียวกัน หรือสร้างไว้ที่อื่นก็ได้ครับ

ผมคิดว่าจะเริ่มแกะ โค้ดของ ปลั๊กอิน page-visit-counter ก่อนว่ามันทำงานยังไง แล้วจะลองปรับโค้ด เพื่อเอาไปใช้ ใน stm_counter.php หรือ ใน ธีม ดูครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 22:34:47 By : lamaka.tor
 


 

No. 17



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 16 เขียนโดย : lamaka.tor เมื่อวันที่ 2021-01-13 22:34:47
รายละเอียดของการตอบ ::
สร้างไฟล์ที่ไหนก็แค่เรียก path ให้ถูก

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 22:55:31 By : mr.v
 


 

No. 18



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


ปัญหาตอนนี้ถ้ามาจากใช้ [..] ใน attribute ไม่ได้ ทางแก้ก็มีอยู่แค่นี้เท่าที่คิดออก

1. ใช้ nested shortcode ให้ถูกต้อง ตัวอย่าง
Code
[parent_shortcode att1="val1" att2="val2"] [counter_shortcode] [/parent_shortcode]

ซึ่งวิธีใช้แบบนี้ผมก็เขียนตัวอย่างทดลองให้ดูแล้วในคห. 10 ลองแกะดู

2. เปลี่ยนวิธีการเรียกใช้ shortcode ใน attribute
จากเดิมใช้แบบนี้ สมมุติ.
Code
[parent_shortcode [counter] att1="val1" att2="val2"]

ก็เปลี่ยนเป็น
Code
[parent_shortcode {my_special_shortcode_counter} att1="val1" att2="val2"]

จากนั้นในโค้ด php ของการแปลง shortcode ตัวที่เป็น parent ให้ดักหา attribute value {my_special_shortcode_counter}
ถ้าพบ ให้แปลงเป็น [my_special_shortcode_counter] โดยใช้ replace
จากนั้นจึงสั่ง do_shortcode() ที่ attribute value นี้
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 23:02:25 By : mr.v
 


 

No. 19



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


แนวทางที่ 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>



custom shortcode curly bracket


ที่เหลือคุณก็ทำความเข้าใจ ทดลองสร้างปลั๊กอินขึ้นมาเพื่อดูว่ามันทำงานได้จริง โดยปิดส่วนอื่นๆไปก่อนให้มีแค่ปลั๊กอินนี้
พอทำงานได้แล้วค่อยเอาไปใส่ในงานจริง จะในธีมหรืออะไรก็ว่าไป แกะโค้ดเอาเอง มาถึงขนาดนี้แล้วไม่ยากหรอก


ประวัติการแก้ไข
2021-01-13 23:17:58
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 23:16:17 By : mr.v
 


 

No. 20



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ขอบคุณมากๆครับ

ขอรบกวนอีกนิดหนึ่ง(อาจจะเยออะะหน่อย)
ยังไงให้ XAMP มีข้อมูลตรงกัน ครับ
คือ ผมมีเครื่องที่บ้าน และ เครื่องที่ทำงาน ลง xamp ไว้ที่ C:\xampp ทั้งคู่
เมื่อก่อนผมใช้วิธี ก๊อบไฟล์ทั้งหมดมาลง

อยากทราบว่า ปกติกันยังไง หรือมีวิธียังไงให้ xamp 2 เครื่องมันมีข้อมูลเดียวกัน เพื่อให้เราทำงานได้ต่อเนื่อง ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-13 23:28:52 By : lamaka.tor
 


 

No. 21



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 20 เขียนโดย : lamaka.tor เมื่อวันที่ 2021-01-13 23:28:52
รายละเอียดของการตอบ ::
ถ้า DB ผมไม่รู้
แต่ถ้าไฟล์งาน ปกติผมจะใช้พวก GitHub ซึ่งเดี๋ยวนี้เขาให้ private repository free แล้วแต่จำกัดอะไรบางอย่าง ก็คงพอใช้ได้

ทำงานเสร็จก็ commit & push

ถึงบ้านก็ pull งานเสร็จก็ commit & push

วันต่อมาทำอีกที่อื่นๆก็ pull วนไป

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-14 02:04:03 By : mr.v
 


 

No. 22



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 21 เขียนโดย : mr.v เมื่อวันที่ 2021-01-14 02:04:03
รายละเอียดของการตอบ ::
ถ้าก๊อบมาทั้ง xamp จะได้ sql มาด้วยครับ
แต่ต้องก๊อบมาวาง path ที่เหมือนกัน ไม่งั้นก็ต้องมานั่งแก้ path ข้างในใหม่หมด

เคยลองทดสอบใช้ใน gdrive ซึ่งที่บ้าน กับที่ทำงานมันอยู่คนละไดร์กัน ต้องมาแก้ใหม่ทั้งหมด
สรุปคือต้องลงใหม่ ไว้ใน C:\xampp ทั้งคู่ ครับ

ถ้าแก้แค่นิดเดียว หรือ เพิ่มหน้า/post ผมก็มักจะแก้บน wordpress เลย
แต่ถ้าแก้โค้ดเยอะๆ ผมก็ต้องโหลดมาลงใน xampp ครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-14 08:22:46 By : lamaka.tor
 


 

No. 23



โพสกระทู้ ( 4,719 )
บทความ ( 8 )



สถานะออฟไลน์


คุณไม่เคยใช้ 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
 


 

No. 24



โพสกระทู้ ( 4,436 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 23 เขียนโดย : mr.v เมื่อวันที่ 2021-01-14 08:48:18
รายละเอียดของการตอบ ::
มันต้อง commit pull เอง เลยไม่ค่อยชอบครับ
GitHub ผมก็เอาไว้แค่อัพงานที่มัน complete นิดหนึ่งแล้วแค่นั้นครับ
ถ้าเป็น Gdrive เวลาทำงานที่แล็บเสร็จ กลับบ้านไปกินข้าวก็ทำงานต่อได้เลย
ทำงานที่บ้านเสร็จกลับมาแล็บก็ทำงานต่อได้เลยเช่นกันโดยไม่ต้องมานั่ง commit pull ครับ
หรือบางที ว่างๆก็หยิบมือถือมานั่งเช็คโค้ด เบื้องต้นได้เลย ผ่าน gdrive ครับ
หรืออาจจะเพิ่ง รูปภาพ ต่างๆ ไฟล์งาน ต่างๆ ก็เพิ่มผ่าน gdrive ได้เลย
ถึงแล็บ หรือ บ้าน ก็นั่งแก้ต่องานมือถือได้เลย
ส่วนตัวมองว่ามันสะดวกดีครับ

ปกติ GitHub มันตั้งให้อัพเดทข้อมูลอัตโนมัติได้ไม๊ครับ ถ้ามันทำได้ก็ตอบโจทย์ ความต้องการ และ จะเอาไปใช้งานครับ



แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-14 09:07:18 By : lamaka.tor
 


 

No. 25



โพสกระทู้ ( 210 )
บทความ ( 0 )



สถานะออฟไลน์


Quote:
มันไม่น่าจะทำได้มั้งครับ shortcode ใน attribute.

ใช่ครับ

Quote:
มันน่าจะมีนะครับ

มีวิธีที่ทำได้ครับ ผมตอบแบบรวมๆ ที่ shortcode ใน attribute ไม่ผ่านเพราะ "The shortcode parser does not accept square brackets within attributes." แต่ข้อความนี้อยู่ใน วัวอ่อน(codex) ซึ่งเป็นเอกสารการใช้งาน WP-core จึงมีผลเฉพาะกับ core แต่สำหรับ ex-core เช่น hardcore, plugin, inject, re-flow, ...etc. จะยังสามารถปรับแต่งข้อจำกัดนี้ หรือข้อจำกัดอื่นๆ ใน core ได้ อย่างกรณีนี้ shortcode parser มันไม่ accept ก็ทำให้มัน accept มีหลายวิธี แต่ตาม WordPress-way คือทำผ่าน hook (action/filter)

"กอด core ตาย ...คลาย core คลอด"


แต่ก็อยู่ที่ความจำเป็นและคุ้มค่าของเวลา ไม่งั้นจะกลายเป็น "ขี่ช้างตบยุง"

ตอบความคิดเห็นที่ : 12 เขียนโดย : lamaka.tor เมื่อวันที่ 2021-01-13 20:13:57
รายละเอียดของการตอบ ::
วิธีการศึกษา PHP + WP (รวมทั้งเรื่องอื่นใดๆ ยกเว้น การแพทย์หรือกฎหมาย) อย่าไปจำ เพราะมันเยอะมว้ากกกกก1,000,000,......ไม่มีทางจำได้หมด ทำความเข้าใจโครงสร้างแล้วค่อยเคี้ยววัวอ่อนเฉพาะส่วนที่ทำก็พอครับ แต่ละคนมีเทคนิคการเรียนรู้ไม่เหมือนกัน



อีกส่วนที่เป็นเสมือนดาบสองคม คือ "hook" จะว่าวิเศษก็วิเศษ จะว่าน่ารำคาญก็ใช่แล้วแต่คนมอง ถ้ามีเวลาพอศึกษาให้เข้าใจจะไปได้เร็วครับ เพราะเป็นกุญแจ/หัวใจ สำคัญของ wp-development


ประวัติการแก้ไข
2021-01-17 12:51:49
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-01-17 12:48:30 By : lakornworld
 


 

No. 26



โพสกระทู้ ( 210 )
บทความ ( 0 )



สถานะออฟไลน์


สำหรับวิธีการแก้ปัญหาของ จขกท. 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
 


 

No. 27



โพสกระทู้ ( 210 )
บทความ ( 0 )



สถานะออฟไลน์


นั่งยัน นอนยัน 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
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
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : Wordpress+ php ผมดึงค่ามาจาก Page Visit Counter ใส่ใน stm_counter แล้ว Error ครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 01
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่