Wordpress-如何在自定义Visual Composer元素中指定ID

时间:2018-08-07 00:17:18

标签: php wordpress custom-post-type custom-wordpress-pages visual-composer

我目前正在为非营利组织建立一个网站,并且正在使用旧版的Wordpress主题Savior

自定义帖子类型为Donations,它允许管理员设置不同的“原因”,每个原因都是具有特定ID的帖子。

默认情况下,主题具有自定义的Visual Composer元素(屏幕截图1-https://i.stack.imgur.com/cmhTu.png),可让您使用最新的“原因”;唯一的自定义选项是VC元素的标题。

我正在尝试更新此自定义VC元素,以便管理员可以为他们希望在页面/帖子中显示的“原因”指定确切的ID,而不是仅显示最新的“原因”。

我已经调整了 cause.php 模板的VC映射,如下所述:

<?php

class STM_VC_Causes {

    function __construct() {
        add_action( 'init', array( $this, 'integrateWithVC' ) );
        add_shortcode( 'stm_causes', array( $this, 'render' ) );
    }

    public function integrateWithVC() {
        if ( function_exists( 'vc_map' ) ) {
            vc_map( array(
                'name'        => __( 'Causes', STM_DOMAIN ),
                'base'        => 'stm_causes',
                'category'    => __( 'STM', STM_DOMAIN ),
                'params'      => array(
                    array(
                        'type' => 'textfield',
                        'class' => '',
                        'heading' => __( 'Title', STM_DOMAIN ),
                        'param_name' => 'title',
                        'value' => __( 'Our Causes', STM_DOMAIN )
                    ),

                    /** ========================================
                     * Qing Custom 8-6-2018
                     * Allow admin to select Cause to feature
                    ======================================== **/

                    array(
                        'type' => 'textfield',
                        'class' => '',
                        'heading' => __( 'Cause ID', STM_DOMAIN ),
                        'param_name' => 'id',
                        'value' => __( '', STM_DOMAIN )
                    )
                )
            ) );
        }
    }


    public function render( $atts, $content = null ) {

        /** ========================================
         * Qing Custom 8-6-2018
         * Display selected Cause ID
        ======================================== **/

        $title = '';
        $id = '';

        extract( shortcode_atts( array(
            'title'       => '',
            'id'       => ''
        ), $atts ) );

        $fea_cause = $atts['id'];
        $donations = new WP_Query( array( 'post_type' => 'donation', 'posts_per_page' => 1, 'post__in' => $fea_cause ) );

        $output = '';
        $output .= '<ul class="donation-grid first clearfix">';
        while ( $donations->have_posts() ) {

            $donations->the_post();
            $target_amount         = ( get_post_meta( get_the_ID(), 'donation_target', true ) == '' ) ? 0 : get_post_meta( get_the_ID(), 'donation_target', true );
            $raised_amount         = ( get_post_meta( get_the_ID(), 'donation_raised', true ) == '' ) ? 0 : get_post_meta( get_the_ID(), 'donation_raised', true );
            $currency              = ( get_post_meta( get_the_ID(), 'donation_currency', true ) == '' ) ? '$' : get_post_meta( get_the_ID(), 'donation_currency', true );
            $donors                = ( get_post_meta( get_the_ID(), 'donation_donors', true ) == '' ) ? 0 : get_post_meta( get_the_ID(), 'donation_donors', true );
            $target_amount_percent = ( $raised_amount / $target_amount ) * 100;

            $output .= '<li id="post-' . get_the_ID() . '" class="' . implode( ' ', get_post_class() ) . '">';
            $output .= '<div class="donation-thumbnail">';
            $output .= '<a href="' . get_the_permalink() . '">';
            if ( has_post_thumbnail() ) {
                $output .= get_the_post_thumbnail( get_the_ID(), 'thumb-150x150' );
            }
            $output .= '</a>';
            $output .= '</div>';
            $output .= '<div class="donation-content">';
            $output .= '<h4><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></h4>';
            $output .= '<div class="progress_bar"><span style="width: ' . $target_amount_percent . '%;"></span></div>';
            $output .= '<div class="donation-stat">';
            $output .= '<span><i class="fa fa-child"></i> ' . __( 'Raised', STM_DOMAIN ) . '<br/>' . $currency . $raised_amount . '</span>';
            $output .= '<span><i class="fa fa-users"></i> ' . __( 'Donors', STM_DOMAIN ) . '<br/>' . $donors . '</span>';
            $output .= '<span><i class="fa fa-thumbs-up"></i> ' . __( 'Goal', STM_DOMAIN ) . '<br/>' . $currency . $target_amount . '</span>';
            $output .= '</div>';
            $output .= '<div class="donate_now">';
            $output .= '<a href="' . get_the_permalink() . '" class="button cause_donate_btn">' . __( 'DONATE NOW', STM_DOMAIN ) . '</a>';
            $output .= '</div>';
            $output .= '</div>';
            $output .= '</li>';
        }
        $output .= '</ul>';
        wp_reset_query();

        return $output;
    }

}

if( defined( 'WPB_VC_VERSION' ) ){
    new STM_VC_Causes();
}

?>

自定义VC元素已正确显示在网站的管理员后端(屏幕截图2-https://i.stack.imgur.com/zKCgs.png),但我不知道如何获取管理员输入的ID才能显示在网站上前端-无论如何,它仍然显示最新的“原因”。屏幕快照3(https://i.stack.imgur.com/13Qw4.png)只是一个示例屏幕快照,显示了实时推送带有自定义VC元素的页面时各个“原因”的样子。

我已经与支持团队联系以获取该主题,但他们只建议使用此Post Types Order WP plugin,该主题仅允许您更改整个网站上显示的“原因”,而不能在逐页/逐个基础。我还搜索了Google / StackOverflow并尝试了WP Codex中的各种查询,构建了一个自定义的短代码(自定义VC元素本身是一个自定义的短代码:[stm_causes]),但它只是显示最新的“原因”。 “

编辑8/7/18:

我已经对Savior主题中的Causes.php模板进行了几次编辑,但是由于某些原因,更新后的WP_Query循环最终没有提取任何数据(屏幕截图3:https://i.stack.imgur.com/JLibO.png

唯一的例外是,如果我在VC编辑器后端中省略了任何ID;如果我不输入ID,则默认为最新的Cause。但是,如果我输入任何ID,即使它与最新帖子的ID是相同的,也不会显示任何内容...

你知道我的逻辑怎么了吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

render功能已修复!

$fea_cause = $atts['id'];    
$donations = new WP_Query( array( 'post_type' => 'donation', 'posts_per_page' => 1, 'post__in' => array($fea_cause )));

Nilesh Sanura的巨大道具为他提供了帮助!