Php wooCommerce自定义端点

Php wooCommerce自定义端点,php,wordpress,woocommerce,Php,Wordpress,Woocommerce,我是一名新的PHP开发人员,我正在尝试为“myaccount”页面创建一个自定义端点。我正在尝试创建一个“添加来宾”端点。我发现很难在网上找到任何文档。到目前为止,我所做的就是使用git hub回购 我创建了这些文件并将它们放在plugins/woocommerce/includes目录中。但它们似乎没有效果。我把它们放在正确的目录里了吗?我可以把这些课程叫到别的地方吗?我不知道我哪里出错了。请给我一些关于这件事的教育 <?php /* * Add custom endpoint th

我是一名新的PHP开发人员,我正在尝试为“myaccount”页面创建一个自定义端点。我正在尝试创建一个“添加来宾”端点。我发现很难在网上找到任何文档。到目前为止,我所做的就是使用git hub回购

我创建了这些文件并将它们放在plugins/woocommerce/includes目录中。但它们似乎没有效果。我把它们放在正确的目录里了吗?我可以把这些课程叫到别的地方吗?我不知道我哪里出错了。请给我一些关于这件事的教育

<?php
/*
 * Add custom endpoint that appears in My Account Page - WooCommerce 2.6
 * Ref - https://gist.github.com/claudiosmweb/a79f4e3992ae96cb821d3b357834a005#file-custom-my-account-endpoint-php
 */


class My_Custom_My_Account_Endpoint {

    /**
     * Custom endpoint name.
     *
     * @var add_students_details
     */
    public static $endpoint = 'add_students_details';

    /**
     * Plugin actions.
     */
    public function __construct() {
        // Actions used to insert a new endpoint in the WordPress.
        add_action( 'init', array( $this, 'add_endpoints' ) );
        add_filter( 'query_vars', array( $this, 'add_query_vars' ), 0 );

        // Change the My Accout page title.
        add_filter( 'the_title', array( $this, 'endpoint_title' ) );

        // Insering your new tab/page into the My Account page.
        add_filter( 'woocommerce_account_menu_items', array( $this, 'new_menu_items' ) );
        add_action( 'woocommerce_account_' . self::$endpoint .  '_endpoint', array( $this, 'endpoint_content' ) );
    }

    /**
     * Register new endpoint to use inside My Account page.
     *
     * @see https://developer.wordpress.org/reference/functions/add_rewrite_endpoint/
     */

    public function add_endpoints() {
        add_rewrite_endpoint( self::$endpoint, EP_ROOT | EP_PAGES );
    }

    /**
     * Add new query var.
     *
     * @param array $vars
     * @return array
     */
    public function add_query_vars( $vars ) {
        $vars[] = self::$endpoint;

        return $vars;
    }

    /**
     * Set endpoint title.
     *
     * @param string $title
     * @return string
     */
    public function endpoint_title( $title ) {
        global $wp_query;

        $is_endpoint = isset( $wp_query->query_vars[ self::$endpoint ] );

        if ( $is_endpoint && ! is_admin() && is_main_query() && in_the_loop() && is_account_page() ) {
            // New page title.
            $title = __( 'My Stuff', 'woocommerce' );

            remove_filter( 'the_title', array( $this, 'endpoint_title' ) );
        }

        return $title;
    }

    /**
     * Insert the new endpoint into the My Account menu.
     *
     * @param array $items
     * @return array
     */
    public function new_menu_items( $items ) {
        // Remove the logout menu item.
        $logout = $items['customer-logout'];
        unset( $items['customer-logout'] );
        // Insert your custom endpoint.
        $items[ self::$endpoint ] = __( 'My Stuff', 'woocommerce' );

        // Insert back the logout item.
        $items['customer-logout'] = $logout;

        return $items;
    }

    /**
     * Endpoint HTML content.
     */
    public function endpoint_content() {
        wc_get_template( 'myaccount/navigation.php' ); ?>

        <div class="woocommerce-MyAccount-content">

            <p>Hello World! - custom field can go here</p>

        </div>

        <?php
    }

    /**
     * Plugin install action.
     * Flush rewrite rules to make our custom endpoint available.
     */
    public static function install() {
        flush_rewrite_rules();
    }
}

new My_Custom_My_Account_Endpoint();

// Flush rewrite rules on plugin activation.
register_activation_hook( __FILE__, array( 'My_Custom_My_Account_Endpoint', 'install' ) );

你好,世界自定义字段可以转到这里

但它们似乎没有效果。我把它们放在正确的目录里了吗?我可以把这些课程叫到别的地方吗?我不知道我哪里出错了。请给我一些关于这件事的教育

首先,您创建了一个类,但从未加载该文件或启动该类。最好的方法是使用自己的插件

其次,必须将
add\u rewrite\u endpoint()
添加到安装函数中。否则,它不知道注册新端点,您的重写规则将刷新,但结果与以前完全相同。。。这会产生一些404错误

第三,最近的WooCommerce为端点标题提供了一个过滤器。而且内容不需要复制My Account div或导航

测试和工作:

<?php
/**
 * Plugin Name: WC Custom Endpoint
 * Plugin URI:  http://stackoverflow.com/questions/38784599/woocommerce-custom-end-points
 * Description: A custom endpoint
 * Version:     0.1.0
 * Author:      Kathy Darling
 * Author URI:  http://kathyisawesome.com
 * Text Domain: wc_custom_endpoint
 * Domain Path: /languages
 * Requires at least: 4.6.0
 * Tested up to: 4.6.0  
 *
 * Copyright: © 2016 Kathy Darling.
 * License: GNU General Public License v3.0
 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
 */


/**
 * The Main WC_Custom_Endpoint class
 **/
if ( ! class_exists( 'WC_Custom_Endpoint' ) ) :

class WC_Custom_Endpoint {

    const VERSION = '0.1.0';

    /**
     * Custom endpoint name.
     */
    public static $endpoint = 'add_students_details';

    /**
     * @var WC_Custom_Endpoint - the single instance of the class
     * @since 0.1.0
     */
    protected static $instance = null;            

    /**
     * Plugin Directory
     *
     * @since 0.1.0
     * @var string $dir
     */
    public $dir = '';

    /**
     * Plugin URL
     *
     * @since 0.1.0
     * @var string $url
     */
    public $url = '';


    /**
     * Main WC_Custom_Endpoint Instance
     *
     * Ensures only one instance of WC_Custom_Endpoint is loaded or can be loaded.
     *
     * @static
     * @see WC_Custom_Endpoint()
     * @return WC_Custom_Endpoint - Main instance
     * @since 0.1.0
     */
    public static function instance() {
        if ( ! isset( self::$instance ) && ! ( self::$instance instanceof WC_Custom_Endpoint ) ) {
            self::$instance = new WC_Custom_Endpoint();
        }
        return self::$instance;
    }


    public function __construct(){

        $this->dir = plugin_dir_path(__FILE__);

        $this->url = plugin_dir_url(__FILE__);

        // Load translation files
        add_action( 'plugins_loaded', array( $this, 'load_plugin_textdomain' ) );

        // Actions used to insert a new endpoint in the WordPress.
        add_action( 'init', array( $this, 'add_endpoints' ) );
        add_filter( 'query_vars', array( $this, 'add_query_vars' ), 0 );

        // Insering your new tab/page into the My Account page.
        add_filter( 'woocommerce_account_menu_items', array( $this, 'new_menu_items' ) );
        add_action( 'woocommerce_endpoint_' . self::$endpoint .  '_title', array( $this, 'endpoint_title' ) );    
        add_action( 'woocommerce_account_' . self::$endpoint .  '_endpoint', array( $this, 'endpoint_content' ) );

    }


    /*-----------------------------------------------------------------------------------*/
    /* Localization */
    /*-----------------------------------------------------------------------------------*/


    /**
     * Make the plugin translation ready
     *
     * @return void
     * @since  1.0
     */
    public function load_plugin_textdomain() {
        load_plugin_textdomain( 'wc-custom-endpoint' , false , dirname( plugin_basename( __FILE__ ) ) .  '/languages/' );
    }

    /*-----------------------------------------------------------------------------------*/
    /* Endpoint */
    /*-----------------------------------------------------------------------------------*/

    /**
     * Register new endpoint to use inside My Account page.
     *
     * @see https://developer.wordpress.org/reference/functions/add_rewrite_endpoint/
     */

    public function add_endpoints() {
        add_rewrite_endpoint( self::$endpoint, EP_ROOT | EP_PAGES );
    }

    /**
     * Add new query var.
     *
     * @param array $vars
     * @return array
     */
    public function add_query_vars( $vars ) {
        $vars[] = self::$endpoint;

        return $vars;
    }


    /*-----------------------------------------------------------------------------------*/
    /* Display */
    /*-----------------------------------------------------------------------------------*/


    /**
     * Set endpoint title.
     *
     * @return string
     */
    public function endpoint_title() {

        return __( 'My Stuff', 'wc_custom_endpoint' );

    }

    /**
     * Insert the new endpoint into the My Account menu.
     *
     * @param array $items
     * @return array
     */
    public function new_menu_items( $items ) {
        // Remove the logout menu item.
        $logout = $items['customer-logout'];
        unset( $items['customer-logout'] );
        // Insert your custom endpoint.
        $items[ self::$endpoint ] = __( 'My Stuff', 'wc_custom_endpoint' );

        // Insert back the logout item.
        $items['customer-logout'] = $logout;

        return $items;
    }

    /**
     * Endpoint HTML content.
     */
    public function endpoint_content() { ?>
        <p>Hello World! - custom wc_get_template() can go here</p>

        <?php
    }

    /*-----------------------------------------------------------------------------------*/
    /* Activation */
    /*-----------------------------------------------------------------------------------*/

    /**
     * Plugin install action.
     * Flush rewrite rules to make our custom endpoint available.
     */
    public static function install() {
        WC_Custom_Endpoint()->add_endpoints();
        flush_rewrite_rules();
    }

    /**
     * Plugin install action.
     * Flush rewrite rules to make our custom endpoint available.
     */
    public static function uninstall() {
        flush_rewrite_rules();
    }

} //end class: do not remove or there will be no more guacamole for you

endif; // end class_exists check


/**
 * Returns the main instance of WC_Custom_Endpoint to prevent the need to use globals.
 *
 * @since  1.0
 * @return WC_Custom_Endpoint
 */
function WC_Custom_Endpoint() {
    return WC_Custom_Endpoint::instance();
}

// Launch the whole plugin
add_action( 'woocommerce_loaded', 'WC_Custom_Endpoint' );

// register activation hook
register_activation_hook( __FILE__, array( 'WC_Custom_Endpoint', 'install' ) );
register_deactivation_hook( __FILE__, array( 'WC_Custom_Endpoint', 'uninstall' ) );

你好,世界自定义wc_get_template()可以转到此处


大家好,欢迎来到Stack Overflow。请在您的问题中包含所有相关代码。@SteffenD.Sommer Hi谢谢您的回复。我添加的代码正确吗?差不多。代码片段功能适用于HTML/CSS/JS。由于您的代码是PHP,我建议您使用代码块。与其将其添加到WooCommerce文件夹,您可能需要将其包装到它自己的插件中。Hey@helgatheviking感谢您的回复。我认为你是对的。我现在将尝试实现这一点。非常感谢,这非常好。谢谢你在这方面教育我当然,你大概有80%的时间在那里。