【问题标题】:WordPress - Overwriting a ShortcodeWordPress - 覆盖简码
【发布时间】:2014-02-11 11:44:50
【问题描述】:

我有一个扩展 Visual Composer 插件的主题,在首页上有一个滑块。滑块将显示来自五个不同客户的五个推荐。我想将每个推荐的特色图像添加为滑块中的缩略图。

这是父主题的缩短代码:

function jo_customers_testimonials_slider( $atts ) {
    extract( shortcode_atts( array( 'limit' => 5, "widget_title" => __('What Are People Saying', 'jo'), 'text_color' => "#000" ), $atts ) );
    $content = "";
    $loopArgs = array( "post_type" => "customers", "posts_per_page" => $limit, 'ignore_sticky_posts' => 1 );

    $postsLoop = new WP_Query( $loopArgs );
    $content = "";

    $content .= '...';
    $content .= '...';
    $content .= '...';

    wp_reset_query();
    return $content;
}
add_shortcode( 'jo_customers_testimonials_slider', 'jo_customers_testimonials_slider' ); 

我的functions.php文件:

function jo_customers_testimonials_slider_with_thumbnail( $atts ) {
    extract( shortcode_atts( array( 'limit' => 5, "widget_title" => __('What Are People Saying', 'jo'), 'text_color' => "#000" ), $atts ) );
    $content = "";
    $loopArgs = array( "post_type" => "customers", "posts_per_page" => $limit, 'ignore_sticky_posts' => 1 );

    $postsLoop = new WP_Query( $loopArgs );
    $content = "";

    $content .= '...';
    $content .= get_the_post_thumbnail( get_the_ID(), 'thumbnail' );
    $content .= '...';
    $content .= '...';

    wp_reset_query();
    return $content;
}
add_shortcode( 'jo_customers_testimonials_slider', 'jo_customers_testimonials_slider_with_thumbnail' );

理论上,我的 functions.php 文件中的函数应该覆盖父主题中的简码。但是当我使用这段代码时似乎什么都没有发生。我做错了什么?

编辑:
试了这段代码,还是不行。

function wpa_add_child_shortcodes(){
remove_shortcode('jo_customers_testimonials_slider');
    add_shortcode( 'jo_customers_testimonials_slider', 'jo_customers_testimonials_slider_with_thumbnail' );
}
add_action( 'after_setup_theme', 'wpa_add_child_shortcodes' );

也改变了
add_action( 'after_setup_theme', 'wpa_add_child_shortcodes' );
add_action( 'init', 'wpa_add_child_shortcodes' );
,但结果没有区别。

编辑 2(有解决方案):

add_action( 'after_setup_theme', 'wpa_add_child_shortcodes' ); 更改为add_action( 'wp_loaded', 'wpa_add_child_shortcodes' ); 解决了它。

【问题讨论】:

    标签: php wordpress-theming wordpress


    【解决方案1】:

    你需要像这样打电话给remove_shortcode();

    remove_shortcode('jo_customers_testimonials_slider');` 
    

    在添加具有相同名称的新短代码以“覆盖”它之前。

    您还需要在父主题运行后调用它,因此我们会触发一个名为 wp_loaded 的动作挂钩。

    function overwrite_shortcode() {
    
        function jo_customers_testimonials_slider_with_thumbnail($atts) {
            extract(shortcode_atts(array('limit' => 5, "widget_title" => __('What Are People Saying', 'jo'), 'text_color' => "#000"), $atts));
            $content = "";
            $loopArgs = array("post_type" => "customers", "posts_per_page" => $limit, 'ignore_sticky_posts' => 1);
    
            $postsLoop = new WP_Query($loopArgs);
            $content = "";
    
            $content .= '...';
            $content .= get_the_post_thumbnail(get_the_ID(), 'thumbnail');
            $content .= '...';
            $content .= '...';
    
            wp_reset_query();
            return $content;
        }
    
        remove_shortcode('jo_customers_testimonials_slider');
        add_shortcode('jo_customers_testimonials_slider', 'jo_customers_testimonials_slider_with_thumbnail');
    }
    
    add_action('wp_loaded', 'overwrite_shortcode');
    

    【讨论】:

    • 试过了。不起作用,因为 functions.php 文件在父主题函数文件之前被调用。
    • 你有没有试过做这样的事情 function shortcode_cleaner() { remove_shortcode(); add_shortcode(); } add_action('init', 'shortcode_cleaner');理论上应该先注册你的短代码并防止他覆盖它。
    • @Daniel 你有一个固执的人......你有没有尝试过我的最后一个建议,但不是在 init 上在 after_setup_theme 钩子上做?或者如果您在他注册后尝试这样做,请尝试 wp_loaded 钩子
    • after_setup_theme 也不起作用。不过感谢您的尝试。
    • @Daniel wp_loaded 钩子呢?很抱歉只是猜测我没有任何儿童主题可供测试。
    【解决方案2】:

    您必须在子主题的 functions.php 中编写此代码

    add_action( 'after_setup_theme', 'calling_child_theme_setup' );
    
    function calling_child_theme_setup() {
       remove_shortcode( 'parent_shortcode_function' );
       add_shortcode( 'shortcode_name', 'child_shortcode_function' );
    }
    
    function child_shortcode_function( $atts) {
        $atts = shortcode_atts( array(
            'img'  => '',
            'cat'  => '',
            'capt' => '',
            'link' => ''
        ), $atts );
    
    //YOUR OWN CODE HERE
    
        $imgSrc = wp_get_attachment_image_src( $atts['img'], 'delicious-gallery' );
    
        $imgFull = wp_get_attachment_image_src( $atts['img'], 'full' );
    
    
    
        $b = '<div class="screen-item" data-groups=\'["'.strtolower(str_replace(' ', '_', $atts["cat"])).'", "all"]\'>'.
    
            '<a href="'.$atts["link"].'" data-title="'.$atts["capt"].'" target="_blank"><img src="'.$imgSrc[0].'" alt="SCREEN" class="screenImg" /></a>'.
    
            '<span>'.$atts["capt"].'</span>'.
    
        '</div>';
    
    //YOUR OWN CODE HERE
    
        return $b;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-07
      • 2014-02-19
      • 1970-01-01
      • 2023-03-21
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多