wooCommerce 自定义端点 [英] wooCommerce custom end points

查看:39
本文介绍了wooCommerce 自定义端点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一名相当新的 PHP 开发人员,我尝试创建的是myaccount"页面的自定义端点.我正在尝试创建一个添加访客"端点.我发现很难在网上找到任何文档.到目前为止我所做的是使用这个 git hub repo

我创建了这些文件并将它们放在 plugins/woocommerce/includes 目录中.但它们似乎没有任何效果.我把它们放在正确的目录中了吗?我反对在其他地方调用这些类吗?我不知道我哪里出错了.可以请一些人教育我这件事.

query_vars[ self::$endpoint ] );if ( $is_endpoint && !is_admin() && is_main_query() && in_the_loop() && is_account_page() ) {//新页面标题.$title = __( '我的东西', 'woocommerce' );remove_filter( 'the_title', array( $this, 'endpoint_title' ) );}返回 $title;}/*** 将新端点插入我的帐户菜单.** @param 数组 $items* @return 数组*/公共函数 new_menu_items( $items ) {//删除注销菜单项.$logout = $items['customer-logout'];取消设置($items['customer-logout']);//插入您的自定义端点.$items[ self::$endpoint ] = __( 'My Stuff', 'woocommerce' );//插回注销项.$items['customer-logout'] = $logout;返回 $items;}/*** 端点 HTML 内容.*/公共函数 endpoint_content() {wc_get_template('myaccount/navigation.php');?><div class="woocommerce-MyAccount-content"><p>你好,世界!- 自定义字段可以在这里

<?php}/***插件安装操作.*刷新重写规则以使我们的自定义端点可用.*/公共静态函数安装(){flush_rewrite_rules();}}新的 My_Custom_My_Account_Endpoint();//刷新插件激活的重写规则.register_activation_hook( __FILE__, array('My_Custom_My_Account_Endpoint', 'install'));

但它们似乎不起作用.我把它们放在正确的目录中了吗?我反对在其他地方调用这些类吗?我不知道我哪里出错了.可以请一些人教我这件事吗.

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

其次,您必须将 add_rewrite_endpoint() 添加到安装函数中.否则,它不知道注册新端点并且您的重写规则被刷新,但最终与之前完全相同......这会产生一些 404 错误.

第三,最近的 WooCommerce 为端点标题提供了过滤器.并且内容不需要复制我的帐户 div 或导航.

测试和工作:

dir = plugin_dir_path(__FILE__);$this->url = plugin_dir_url(__FILE__);//加载翻译文件add_action( 'plugins_loaded', array( $this, 'load_plugin_textdomain' ) );//用于在 WordPress 中插入新端点的操作.add_action( 'init', array( $this, 'add_endpoints' ) );add_filter( 'query_vars', array( $this, 'add_query_vars' ), 0 );//将您的新标签/页面插入我的帐户"页面.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' ) );}/*-------------------------------------------------------------------------------------*//* 本地化 *//*-------------------------------------------------------------------------------------*//*** 准备好插件翻译** @return 无效* @从 1.0 开始*/公共函数 load_plugin_textdomain() {load_plugin_textdomain( 'wc-custom-endpoint' , false , dirname( plugin_basename( __FILE__ ) ) . '/languages/' );}/*-------------------------------------------------------------------------------------*//* 端点 *//*-------------------------------------------------------------------------------------*//*** 注册新端点以在我的帐户"页面内使用.** @see https://developer.wordpress.org/reference/functions/add_rewrite_endpoint/*/公共函数 add_endpoints() {add_rewrite_endpoint( self::$endpoint, EP_ROOT | EP_PAGES );}/*** 添加新的查询变量.** @param 数组 $vars* @return 数组*/公共函数 add_query_vars( $vars ) {$vars[] = self::$endpoint;返回 $vars;}/*-------------------------------------------------------------------------------------*//* 展示 *//*-------------------------------------------------------------------------------------*//*** 设置端点标题.** @return 字符串*/公共函数 endpoint_title() {返回 __( '我的东西', 'wc_custom_endpoint' );}/*** 将新端点插入我的帐户菜单.** @param 数组 $items* @return 数组*/公共函数 new_menu_items( $items ) {//删除注销菜单项.$logout = $items['customer-logout'];取消设置($items['customer-logout']);//插入您的自定义端点.$items[ self::$endpoint ] = __( 'My Stuff', 'wc_custom_endpoint' );//插回注销项.$items['customer-logout'] = $logout;返回 $items;}/*** 端点 HTML 内容.*/公共函数 endpoint_content() { ?><p>你好,世界!- 自定义 wc_get_template() 可以去这里</p><?php}/*-------------------------------------------------------------------------------------*//* 激活 *//*-------------------------------------------------------------------------------------*//***插件安装操作.*刷新重写规则以使我们的自定义端点可用.*/公共静态函数安装(){WC_Custom_Endpoint()->add_endpoints();flush_rewrite_rules();}/***插件安装操作.*刷新重写规则以使我们的自定义端点可用.*/公共静态函数卸载(){flush_rewrite_rules();}}//结束课程:不要移除,否则你将没有更多的鳄梨酱万一;//结束 class_exists 检查/*** 返回 WC_Custom_Endpoint 的主要实例以防止需要使用全局变量.** @从 1.0 开始* @return WC_Custom_Endpoint*/函数 WC_Custom_Endpoint() {返回 WC_Custom_Endpoint::instance();}//启动整个插件add_action('woocommerce_loaded', 'WC_Custom_Endpoint');//注册激活钩子register_activation_hook( __FILE__, array('WC_Custom_Endpoint', 'install'));register_deactivation_hook( __FILE__, array('WC_Custom_Endpoint', 'uninstall'));

I am a fairly new PHP developer and what I am trying to create is a custom endpoint for the "myaccount" page . I am trying to create a "Add Guest" end point. I am finding it very difficult to find any documentation online. What I have done so far is used this git hub repo

https://gist.github.com/neilgee/13ac00c86c903c4ab30544b2b76c483c/a43701564ab696e1586e2879591c890b67a5f1bf#file-woo-endpoints-order-php

I created these files and put them in the plugins/woocommerce/includes directory. But they seem to take no effect. Have i put them in the correct directory? Am I soppose to call these classes somewhere else ? I have no idea where I going wrong. Can some please educate me on this matter.

<?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' ) );

解决方案

But they seem to take no effect. Have i put them in the correct directory? Am I soppose to call these classes somewhere else ? I have no idea where I going wrong. Can some please educate me on this matter.

First thing, you created a class, but you never loaded that file or initiated the class. The best way to do this would be in your own plugin.

Second, you have to add the add_rewrite_endpoint() to the install function. Otherwise, it doesn't know to register the new endpoint and your rewrite rules are flushed, but end up exactly the same as they were before... which creates some 404 errors.

Third, recent WooCommerce provides a filter for the endpoint title. And the content doesn't need to reproduce the My Account div or navigation.

Tested and working:

<?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' ) );

这篇关于wooCommerce 自定义端点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆