2340条评论

  1. 遇到一个问题请教下,我在wordpress建立了一个自定义文章类型store
    在固定链接这里出现了问题,如果固定链接设置成 /archives/%post_id% 的时候,store归档页面变成了 /archives/store ,URL中多了一个archives,如果设置成其他的就会正常的是/store/ 这种格式。现在我想用/archives/%post_id%这种固定链接,要怎么将store归档页面URL中的archives去掉呢?请指教!!add_rewrite_rule该怎么写?

  2. 版主 我想請教一下 我的WOOCOMMERCE 跟我的主題不知道是否有衝突

    我將商品分類拉至選單上 在從前台連過去該選單 進去後 版型怪異
    如網址http://www.badichibelts.com.tw/product-category/%E7%94%B7%E6%AC%BE/%E4%BC%91%E9%96%92%E9%A2%A8%E6%A0%BC/
    (全部靠左、Slider 跑到最下方)

    我在變更主題用其他主題 又恢復正常 商品在中間 SLIDER在最右邊….

    希望妳能夠幫助我解決這項問題 感謝

    1. 你的主题不兼容woocommerce,简单看下有两个问题:
      第一,woocommerce输出的结构和你主题不相符,你的主题结构是section > div.container这种,现在缺少div.container
      第二,woocommerce的样式表没有加载,这应该不是插件问题,可能你主题有写的不规范的地方,或者其它原因,需要看站点才知道。

      第一条只需要根据woocommerce主题集成方法改一下就行,是正常情况。第二条不正常,找找问题吧。

      1. 首先很感謝板大的回覆…

        其實我才剛在摸索wp
        第一條:所說的主題集成方法 該怎麼做呢?! 不太懂意思
        第二條:什麼是站點呢?

  3. 博主,很高兴能收到你的回复
    我找了paypal for woocommerce早期版本和现在的版本,参考和尝试,但都失败了。我迫切的需要你的帮助,毕竟我才刚刚接触这方面的东西。
    我是用的接口是快钱接口,我看了他们的demo和开发文档,貌似用的程序比较传统,不支持你所说的方式。
    如果你有空,请您在百忙中回复我一封邮件,方便我联系你,占用您的一点时间以获得您进一步的帮助。
    提前致谢!

    1. 你好,博主,很抱歉再次打扰,那博主是否有空给我列一下示范代码
      我需要将一段提交上去,但是我不知道怎么提交并且跳转到支付页面。期望博主能够帮助我,谢谢!

      1. 啊,博主,非常抱歉,我刚才提交了才刷新到您的回复,非常感谢您的帮助和支持!您的指点,应该会让我和更多的人少走弯路。我会认真研究您的代码的。马上就要过年了,提前祝博主新年快乐,身体健康!

  4. 博主你好,我的问题比较长,在你这发不出去,你能不能留个联系方式给我,我好把问题发送过去。

    我写的支付接口插件,post form 老是返回 SYNTAXERROR: UNEXPECTED TOKEN < 错误怎么解决

    1. 我不提供邮箱支持,没那么多时间。你这个错误是说token不对吗,这一般是没按官方要求写的结果,仔细检查下post 数据。支付接口应该提供demo吧,可以先运行demo确认不是你的设置问题,像支付宝要是合作者ID之类的写错,或者服务没开通,也会各种报错的。

      1. 博主你好,很高兴能收到你的回复
        我的post数据是正确的,独立运行demo是没有问题的,主要的问题是它自己不跳转,在demo中他会自动跳转。
        代码如下
        $html_text=’

        document.E_FORM.submit();’;
        由于留言字数限制,我在下一个留言中继续发

        1. 博主,看来代码发送了无法正常显示,你能否私下给我个联系方式,我好贴代码。
          我主要的问题是
          return array(‘result’ => ‘success’, ‘redirect’ => $html_text);
          这个代码不跳转,返回错误
          SYNTAXERROR: UNEXPECTED TOKEN add_query_arg(‘key’, $order->order_key, add_query_arg(‘order’,
          $order_id, get_permalink(get_option(‘woocommerce_thanks_page_id’))反而可以
          我期望跳转到新的页面 输出$html_text内的form数据

        2. 代码用第三方服务发吧,我设置的代码标签是pre,重写主题时一偷懒没把这句话写上。

          言归正传,你用的这段代码是用get方式发送数据,一般用法是把订单信息放进url参数直接跳转到网关支付页面。所以redirect的值应该是一个标准url。

          如果你想用post发送数据,需要跳转到order received页面再输出表单,之后可以用户点提交或者写js代码自动提交表单。

          这个代码早期版本woocommerce自带的paypal代码里有,具体版本我忘了,你找找paypal带post方式提交数据选项的那一版。

          最后说一句,如果你的支付接口不要求必须用post,考虑下get吧,二者区别并不大,paypal支付宝之类的都支持用get

    2. 代码你看懂了吗?举例woocommerce 2.1.3里的class-wc-gateway-paypal.php,实现post表单的key points如下:

      1. construct里的add_action( ‘woocommerce_receipt_paypal’, array( $this, ‘receipt_page’ ) ),其中的paypal要替换成你自己的网关ID

      2. receipt_page函数调用输出表单的函数,这个照抄,没啥可说的。

      function receipt_page( $order ) {
      	...
      	echo $this->generate_paypal_form( $order );
      }

      3. 输出表单的函数

      function generate_paypal_form( $order_id ) {
      
      	$order = new WC_Order( $order_id );
      
      	if ( 'yes' == $this->testmode ) {
      		$paypal_adr = $this->testurl . '?test_ipn=1&';
      	} else {
      		$paypal_adr = $this->liveurl . '?';
      	}
      
      	$paypal_args = $this->get_paypal_args( $order );
      
      	$paypal_args_array = array();
      
      	foreach ( $paypal_args as $key => $value ) {
      		$paypal_args_array[] = '<input type="hidden" name="'.esc_attr( $key ) . '" value="' . esc_attr( $value ) . '" />';
      	}
      
      	wc_enqueue_js( '
      		$.blockUI({
      				message: "' . esc_js( __( 'Thank you for your order. We are now redirecting you to PayPal to make payment.', 'woocommerce' ) ) . '",
      				baseZ: 99999,
      				overlayCSS:
      				{
      					background: "#fff",
      					opacity: 0.6
      				},
      				css: {
      					padding:        "20px",
      					zindex:         "9999999",
      					textAlign:      "center",
      					color:          "#555",
      					border:         "3px solid #aaa",
      					backgroundColor:"#fff",
      					cursor:         "wait",
      					lineHeight:		"24px",
      				}
      			});
      		jQuery("#submit_paypal_payment_form").click();
      	' );
      
      	return '<form action="' . esc_url( $paypal_adr ) . '" method="post" id="paypal_payment_form" target="_top">
      			' . implode( '', $paypal_args_array ) . '
      			<!-- Button Fallback -->
      			<div class="payment_buttons">
      				<input type="submit" class="button alt" id="submit_paypal_payment_form" value="' . __( 'Pay via PayPal', 'woocommerce' ) . '" /> <a class="button cancel" href="' . esc_url( $order->get_cancel_order_url() ) . '">' . __( 'Cancel order &amp; restore cart', 'woocommerce' ) . '</a>
      			</div>
      			<script type="text/javascript">
      				jQuery(".payment_buttons").hide();
      			</script>
      		</form>';
      
      }

      对第三步简单说明
      1) $paypal_args = $this->get_paypal_args( $order )获取需要传递的参数,你要根据你的网关文档重写。
      2) wc_enqueue_js这部分是自动提交表单的js,把jQuery(“#submit_paypal_payment_form”).click();里的ID替换成自己表单里的,其余照抄。
      3) return那一段就是返回整个表单结构,数据替换成自己的就行了。

      4. 如何实现place order后输出表单而不是直接跳转到网关

      function process_payment( $order_id ) {
      
      	$order = new WC_Order( $order_id );
      
      	if ( ! $this->form_submission_method ) {
      
      		//直接跳转到网关支付
      		return array(
      			'result' 	=> 'success',
      			'redirect'	=> $paypal_adr . $paypal_args
      		);
      
      	} else {
      		//跳转到order received页面显示表单
      		return array(
      			'result' 	=> 'success',
      			'redirect'	=> $order->get_checkout_payment_url( true )
      		);
      
      	}
      
      }

      其实 就是跳转的地址不一样。

      先看懂这些再说别的。我并没有义务给所有人提供邮箱技术支持,这个仅限客户,因为时间不够。

  5. 博主,你好,你的留言板好像无法在苹果电脑上留言,另外,我有个问题要请教一下,你能留个邮箱吗

    1. 我的问题挺长的,所以返回了错误(望修复),博主能留个联系方式,我把问题发过去。

    1. 虽然不想跟你说网站有js或php错误这种废话,但这种问题不具体看站点很难说出原因。只能告诉你一些思路:
      1. 找js错误,用chrome浏览器的审查工具(inspector)里的控制台看
      2. 找php错误,查看站点的error log文件
      3. 切换到默认主题,逐个禁用插件的排除法

      如果排序点了没反应,那js脚本错误的概率较高

  6. sola您好,想请教一个关于Advanced custom fields 插件问题,如果有时间的话,谢谢~
    我在输出分类的时候,分类的链接可以获取得到,但是分类的名称获取不到,也就是 name; ?> 输入不了资源,但 可以获取到链接。
    代码如下

    name; ?>
    description; ?>
    <a href="”>View all ‘name; ?>’ posts

  7. 还有另一个相关的问题要请教。

    我想在每篇博文末统一添加一些信息,在single.php添加代码:

     <?php while ( have_posts() ) : the_post(); ?>
                 <?php get_template_part( 'content', 'single' ); ?>
                              /** 这里添加我的内容 **/
    

    但所添加的内容会跑到 “分类 | 标签” 下面,但我希望所添加的内容能在文章末尾或者说 “分类 | 标签” 的前面。我猜想,应该是用add_action做,需要您进一步指点。

    1. 重点是先找出“分类|标签”代码的位置,如果这段代码是用action加的,那你只需要调整一下你add_action的优先级,便于统一管理代码。不用add_action也可以,因为这里的add_action操作也无非就是模板中的一个位置,只要你的内容加到这个位置之前就行了。

      1. 谢谢Sola,搞定啦,在我的主题content-single.php文件相应位置加入内容,如下:

        /* 在这里加入内容 */
          <footer class="entry-meta">
        

        再次感谢Sola一如既往的指点:-)

  8. Hi, Sola, 你好。

    如何修改插件在博客的显示位置,比如把YARP插件显示的 相关文章 移到 评论区 之前(默认是放在文章正文末尾, 分类/标签 之前)。我找了下,大概解决方法是:在fuctions.php中,先用remvoe_action将插件移除,再用add_action将插件hook到指定位置,但我是不知道具体怎么做,期待您进一步指点。

    1. 首先到yarpp的设置里关闭自动显示,然后在主题里插入模板标签related_posts()来显示相关文章,这样可以自己控制显示位置。至于你说的评论区之前,这个位置在哪需要自己试验一下,每个主题都不一样。

      1. 谢谢Sola,搞定了,我的主题是在single.php,插入related_posts(),如下:

         <?php radiate_post_nav(); ?>
         
         <?php /* add the related posts by sparkandshine */ ?>
         <?php related_posts(); ?>
        
  9. sola您好,woocommerce有没有好的报表插件

    例如想查看\导出,单日所有商品销售数量,总价 这样

  10. Sola 大神你好
    我又来了,这次是想解决这么一个问题:
    我现在用户下单的时候,
    如果这个订单是他支付的第一个订单(这个客户过去可能有订单被取消或者未被支付)给他减免10块钱。
    不知是否有比较简便的方法,在google和您的博客中没有搜到类似的功能。
    多谢!

  11. Hi, Sola, 如何让

    <pre class="brush: py; toolbar: false;">能代码高亮? 比如我在你的评论区,用pre标签手插入代码,但没看到有高亮,我也遇到类似的问题。

    1. 上面那一行代码没有显示,去掉尖括号,内容如下:

      pre class=”brush: py; toolbar: false;”

    2. 代码高亮分为两部分,一是html结构,二是用于渲染样式的js和css文件。我的评论区只有前者没有后者,所以看到的就是主题默认的pre样式。我装的插件只在文章中有代码时才加载高亮的js和css文件。

      1. 谢谢Sola,代码插件我使用SyntaxHighlighter Evolved,插入代码块是用pre标签,如:

        pre class="brush: py; toolbar: false;"
        ...
        /pre
        

        但渲染之后就变成了(用inspect查看):

        div id="highlighter_539499" class="syntaxhighlighter  python"
        ...
        /div
        
  12. 接着上一个问题,还有一个问题要请教。

    事实上,我想在标题下面那一行(原本为:时间、作者,如:Saturday January 9th, 2016 SparkandShine),增加两个域,变成:时间、作者、阅读次数、评论次数,如:Saturday January 9th, 2016 SparkandShine, 8 views, 暂无评论。

    然后我对着源代码修改,但最后却显示为(将阅读次数和评论次数显示到最前了):

    8暂无评论 Saturday January 9th, 2016 SparkandShine views

    相关源代码如下,期待您的指点:

    <code>
    printf( '<span class="posted-on">%1$s</span><span class="byline">%2$s</span>  //这里没有问题
    	<span class="views-link">%3$s</span><span class="comments-link">%4$s</span>', //我新加的
    		sprintf( ... ),  // 这里没有问题
    		sprintf( ... ),	 // 这里没有问题
    		sprintf('%1$s views', the_views()), //我新加的
    		sprintf('%1$s', comments_popup_link( __( 'Leave a comment', 'radiate' ), __( '1 Comment', 'radiate' ), __( '% Comments', 'radiate' ) ))  //我新加的
    );
    </code>
      1. 谢谢Sola。那没道理,前面两个是正常的。以下是评论的css:

        .entry-meta .comments-link:before {
                display: inline-block;
                -webkit-font-smoothing: antialiased;
           -moz-osx-font-smoothing: grayscale;
                font: normal 22px/1 'Genericons';
                vertical-align: top;
        }
        .entry-meta .comments-link:before       { content: '\f300'; }
        
        1. 我试了试没发现有问题啊,你用firebug或者chrome inspector看一下html结构,是否是下面这样

          <div class="entry-meta">
              <span class="posted-on">...</span>
              <span class="posted-on-updated">...</span>
              <span class="byline">...</span>
              <span class="views-link">...</span>
              <span class="comments-link">...</span>
          </div>
          

          我直接在你网页上改没发现有什么样式问题。

        2. Hi Sola. 这个问题我解决了,该问题的原因是the_views()直接是输出的(echo …),而不是返回一个变量。

          我查看了下the_views()源码,调用the_views()传递参数false,使其返回一个变量,现在显示正常了。

          function the_views($display = true, $prefix = '', $postfix = '', $always = false) {
          }
          

          再次感谢。

  13. 又有问题请教啦。

    我想修改主题的某个函数radiate_posted_on(用于显示文章标题下面的那一行,时间、作者,文件位于themes/radiate/inc/template-tags.php ),我将该函数在子主题themes/radiate-child-01/functions.php内得写,如下:

    function radiate_posted_on() {

    }
    add_action( ‘after_setup_theme’, ‘radiate_posted_on’);

    想问下,add_action的第一个参数$hook用after_setup_theme对吗?(我查看了Actions Run During a Typical Request,https://codex.wordpress.org/Plugin_API/Action_Reference,但自已不确定

    1. 我发现没必要加add_action,因为/inc/template-tags.php的源代码为:

      if ( ! function_exists( 'radiate_posted_on' ) ) :
      /**
       * Prints HTML with meta information for the current post-date/time and author.
       */
      function radiate_posted_on() {
      ...
      }
      
    2. 是的。 如果把php代码执行过程比喻成一列火车的话,action(例如after_setup_theme)就是这列火车的某节车厢,function( 比如radiate_posted_on )是登上这节车厢的乘客。一节车厢可以上多个乘客,车厢限制了乘客在列车中的位置,换成代码就是代码执行的位置。

      所以用after_setup_theme或者registered_taxonomy都没有语法错误,只取决于你想在哪个位置执行代码。比如registered_taxonomy的位置远比after_setup_theme靠前,这时候插件和主题的代码还未加载,如果你的代码和他们有关系,放在这里就不合适了。WordPress加载时会设置运行环境,加载核心代码,每个小过程都能找到一个代表性的action,说几个重要的。

      plugins_loaded
                   -  加载并执行所有激活的插件的文件,这个action执行时表示所有激活插件代码刚刚加载完毕。
      
      setup_theme
                   - 载入当前主题的functions.php,functions.php中没有用add_filter或add_action添加的函数在这里被执行
      
      after_setup_theme
                  - 主题代码执行完毕
      
      set_current_user
                 - 这里执行了wp_set_current_user()函数,全局变量$current_user产生,也就是函数挂在到这之前的action是无法获取登陆用户信息的,除了is_admin()函数。
      
      template_redirect
                - 根据请求url加载主题模板,如果想显示自定义模板,可以直接在这里include自己的模板,然后终止程序运行。
      
      1. Hi Sola,

        我猜问题出在,当调用radiate_posted_on()函数时,插件wp-postviews还没被加载,也就是说the_views()这个时候没法返回值。

        待到wp-postviews加载完了,才把the_views()显示出来,所以格式有点乱了。

        如果真是这样的话,倒是可以从以下两方面解决:

        (i)让wp-postviews在radiate_posted_on()之前加载,这样不是个好方法,文章内容会推迟显示。另,我查了下解决方法,倒是有不少插件,可以自定义插件加载的顺序。

        (ii)为the_views()预留一个点位符,待到wp-postviews加载完,再填上去。话说,可以做到吗?

        期待你的看法。

        1. 我明白你要干啥了!radiate_posted_on()是一个template tag,作用是在模板中显示内容,不需要add_action这类操作,这个函数应该是直接在模板里调用的。

          你要做的只是把显示post views的代码加入这个函数,如果你用了child theme,且注意到这个函数定义开头有if ( ! function_exists( ‘radiate_posted_on’ ) ) 的声明,那你就可以直接在child theme的functions.php里覆盖这个函数,即直接写function radiate_posted_on(){…}。

          the_views()也是template tag,写进radiate_posted_on没问题,因为前者是在模板里运行的,而WordPress调用模板时所有要用到的数据都已经加载完毕。

  14. Hi Solagirl,

    最近开始用markdown写博文,又碰到了代码高亮问题(其实之前也碰到过,只是换了个插件绕过),即在代码块中部分字符显示为html entries,如<显示的是& lt;

    我用inspect elements查看了下,使用的是div标签,而不是pre标签,举例如下:

    期待您一如既往的指点。

    1. PS: div标签那段代码不能正常显示,处理下,补发一条留言:

      div id=”highlighter_539499″ class=”syntaxhighlighter python”

    2. 进一步查看了一些材料,”& ” 会被自动转换为HTML实体,如下:

      > Within a code block, ampersands (&) and angle brackets () are automatically converted into HTML entities.

      但我在使用过程中,发现单引号也会被自动转换成HTML实体。

      1. 不转化就会识别为HTML代码导致结构出错,转化成HTML实体才能显示代码而不是执行代码。

        pre标签与其他标签的本质区别是能保留多余的空格、制表符和换行符,pre + code标签相结合显示代码是一种语义明显的写法,利于搜索引擎识别。
        所以pre标签内部用于格式化代码的标签(div code等)不转义、作为正常标签显示。被显示的代码要转义,作为普通文本输出,由此完成代码高亮显示的过程。

        你所描述的状况是说代码显示成了实体,这可能是转义的时候出错了,比如已经转成html实体的代码又被转了一次,导致html 实体代码也成了普通文本,就原样显示了。建议使用代码高亮插件时,不要多次复制粘贴,切换到html源代码检查是否有多次转义的现象。

        1. 好的,谢谢Solagirl。我又看了下,markdown将整个代码块縮进4个字符(或者一个tab),转化成html时,会自动插入pre和code标签。但还是没法正常高亮代码。我放了一些测试例子在这里(http://sparkandshine.net/en/test-for-jp-markdown/)。

          你说的用插件,我安装了synatxhighlighter envoved, 但在写博文的时候,没发现有按钮可以直接插入代码的。

        2. Hi, Sola

          关于markdown代码高亮,先后尝试了JP markdown, PrettyPress, wp markdown editor,最后使用wp markdown editor,成功绕过该问题了。

        3. wait, wait, 还是没解决。我再想想办法,回头解决了,再跟你分享。

  15. 想请问一下博主,wordpress有没有那种 类似于京东的商品对比的插件啊,我在网上找了半天,都没有找到啊

    1. 如果用woocommerce做商城的话有对比插件可用,比如https://wordpress.org/plugins/yith-woocommerce-compare/

  16. 很佩服站长做的这个站。不过其实我个人觉得wordpress本身就是要让不会写代码的人去更关注内容而不是代码或服务器这些,站长应该多出售一些成品的“解决方案”嘛,包括主题啊之类的,使得我这种小白用户更focus在核心业务上嘛:)

    1. 这俩也不冲突啊,这个博客是用来学习的网络笔记本,目前没有卖东西的打算。想买主题插件,可去的地方太多了,多我一个不多就不凑热闹了。

    1. 两年没聊过天了,不太方便。你装文章里的插件试一下,如果不是php设置问题,我也无能为力,找hosting。

    1. 给你一份无所谓,不过这东西一直在升级,就算你给钱我也不想每次更新时发一遍,太费时间了,建议还是自己买一个。
      我用qq邮箱发给你留言的邮箱了,请查收。

      1. 刚看到,多谢美女,我已经从其他站长那买了一个汉化版的,更新过后是不是老版本就不能用了?

        1. 你确定你买的不是最新版吗?如果不是,可以把语言文件拷贝过去,不过用习惯了其实英语汉语都一样啦,长相也是种语言。

  17. Hi Solagirl,

    看了你的《WordPress CKEditor定制方法总结》,有个疑问,插件equations(插入数学公式的),实际上转换为图片?所以,修改公式得重新打一遍?

    还有一个问题,我安装了CKEditor for wordpress,启用后,写文章页面,什么都不显示(Editor相关的,比如工具栏、菜单栏),只显示文本|可视化。

    我试了其他富文本插件,很多都存在这个问题,包括CKEditor(什么都不显示,只有文本|可视化), JP Markdown(显示的是默认的编辑器),TinyMCE则可以正常显示。另,如果转向TinyMCE,有两个版本TinyMCE Advanced 和Ultimate TinyMCE,你建议是用哪个?

    1. 是这样的,我打算从离线window live writer转到wordpress后台直接写(考虑到跨平台),我看了你的一些相关博文,已满足我所有需求,即CKEditor + SyntaxHighter + equations.

      还有一种方法,直接用markdown(数学公式直接是支持的),但代码高亮如果用SyntaxHighter的话,不知道能不能用你博文《为CKEditor For WordPress插件增加代码高亮功能》中的‘如何安装CKEditor Syntaxhighlighter插件’的方法,也让markdown用上SyntaxHighter。
      (兴许markdown代码高亮用的也是SyntaxHighter,那也就不用费事了)

      1. Solagirl, hello again,

        刚才又看了一些材料,我想我把问题解决了,分享如下:

        (1)关于编辑器,显示默认编辑器是正常的,只需切换到文本模式,直接写入markdown就可以了

        (2)关于数学公式,需要加载MathJax引擎,实际显示效果要比插入图片美观许多,也节省空间:-)

        (3)代码高亮,使用的是syntaxhighlighter

        这里(http://sparkandshine.net/test-for-jp-markdown/)是一个测试例子。

        1. 看了下效果确实很好。
          我觉得你的解决方案更值得推崇,其它编辑器的支持不是太好,比如CKEditor,有段时间已经停止维护了,还是用默认的比较安全。

          TinyMCE Advanced除了界面不好看别的都可以,Ultimate TinyMCE已经不维护了,可以试试他的新版WP Edit,界面很舒服。https://wordpress.org/plugins/wp-edit/

        2. 谢谢Solagirl,我先用jp markdown一段时间看看,也许能最终解决我一直困扰的编辑器问题:-)

      1. 今天没事,(—(工)—)看(yi)来(ban)不(ban)错(啦)啊。
        姐姐,你喜欢维也纳新年音乐会不?

  18. 博主大神,最近几天看您写的”WooCommerce如何扩展支付方式“感觉很厉害,我很好的一个朋友委托我对WooCommerce进行支付方式的二次开发,但是努力 两天发现还是不能很好地切入,想问问博主有没有兴趣接这个单子,我可以把我的酬劳全部转给您

    跪求大神帮忙,我有留邮箱

    打扰博主了

    1. 我只是写过支付宝的,那会看了好几天才明白支付宝文档在扯啥,你不懂我懂的地方帮帮你可以啦,不过接单子就免了。

      1. 多谢博主大大

        小弟主要想问一下这种情形,就是我的需求是 先收集购物车的信息,跳转到我们自己定制的页面,由用户进行支付

        请问这种跳转的方式是否可行,如果可以的话,小弟该如何实现呢(目前是通过实现继承Gateway的方式,添加支付方式
        ,但是不知道怎么处理process_payment来实现跳转)

        还有就是朋友希望我能在 购物车页面加一个按钮来跳转,而不是在checkout页面点支付方式进行跳转

        不知道可不可行

        小白一个,望博主不要嫌弃 🙂

        1. 如果是我的话会直接定制checkout页面,购物车的信息即使是自定义的,也可以和默认信息一起存入数据库啊,对于自己收集信息的必要性我不太理解。另外购物车跳转什么意思?不用确认订单就支付吗?

          如果按照woocmmerce默认的方式来做,只需要根据文档扩展支付方式即可,像process_payment的跳转按照规矩写就行,怎么跳不用理会。增加支付方式正常的过程就像办护照一样,表就摆在那,填上对方要求的信息就得了。

          但你要在表里填额外内容,那就要先问下人家是否允许写额外内容,比如给你个备注之类的。有的话,那还是按规矩办事。没有,那就麻烦了,你要自己来处理好多东西,人家更新时你可能无法更新。所以整理清楚自己的需求,明白人家提供了哪些办法让你更改默认状态,再继续项目。

        2. 多谢 博主大大

          熬了几天算是弄清楚了个大概,有个问题我最近一直找不到答案

          就是在cart页面,只有一个form但是有两个submit,一个是update cart一个是跳转到checkout页面

          我猜想是通过JS实现的,但是一直找不到源码在哪里

          求问博主接触过 这一块内容么?

          另祝博主大大新年快乐呀

  19. 大神,我又来了,我在开发微信支付的时候,支付回调了我的notify文件,我可以在支付成功后修改订单状态:
    $table = “wp_posts”;
    $data_arry = array(
    ‘post_status’ => ‘wc-processing’
    );
    $where_arry = array(‘ID’ => $order_id );
    $wpdb->update($table,$data_arry,$where_arry);
    但这样直接改,只能修改订单状态为“处理”,不能自动给我和用户发邮件。
    是不是有一个类或者函数,可以在更新订单状态的时候同时发邮件?支付宝插件在回调的时候是如何处理这部分的呢?
    google了半天,没有找到,所以有来请教你了!

      1. $order = new WC_Order( $order_id );
        $order->update_status(‘processing’);
        我用了这个,确实可以改变订单状态,但没有自动发邮件。
        请问具体update_status这个函数是在abstract-wc-order.php这个文件中吗?
        貌似这里是有从$old_status 更新到 $new_status,没有看到哪里根据状态更新发送邮件。
        请指点,十分感谢!

        1. 如果你不是要发自定义邮件,那集成gateway的过程并不需要知道邮件是怎么发的,这些woocommerce已经处理好了。你应该按照https://docs.woothemes.com/document/payment-gateway-api/这个文档来开发。

          邮件发送,简单的说就是更新订单状态时,如果状态变化符合某个邮件的触发条件,该邮件就会被发送。具体过程评论里说有点长,所以要写到文章里了,感兴趣可以看看https://www.solagirl.net/woocommerce-email-sending-process.html

        2. 看了你的文章(https://www.solagirl.net/woocommerce-email-sending-process.html)受益匪浅,找到了无法发送邮件的原因
          我虽然用了$order->update_status(‘processing’);
          但是在这里
          do_action( ‘woocommerce_order_status_’ . $old_status . ‘_to_’ . $new_status, $this->id );
          $old_status = “wc-pending” 而不是 ”pending“
          因此根本没有触发这个action:
          woocommerce_order_status_pending_to_processing这个action
          所以也就没有自动发送邮件。
          在$order_update()中增加了一下处理
          按$new_status的方式做了格式化:
          $new_status = ‘wc-‘ === substr( $new_status, 0, 3 ) ? substr( $new_status, 3 ) : $new_status;
          $old_status = $this->get_status();
          //将status改为标准默认的值,取消前面的wc-前缀,否则无法在更新状态的时候自动发送邮件
          $old_status = ‘wc-‘ === substr( $old_status, 0, 3 ) ? substr( $old_status, 3 ) : $old_status;
          这样就可以自动发送邮件了。
          多谢大神指点 :)

        3. wc的所有status都有wc这个前缀,并不需要做什么处理。我不太明白你的代码为何要手动去前缀,但这种做法肯定不合理,问题可能出在别的地方。

        4. 啊,在do_action( ‘woocommerce_order_status_’ . $old_status . ‘_to_’ . $new_status, $this->id );中$old_status = “wc-pending” 而不是 ”pending“
          所以就等于是
          do_action( ‘woocommerce_order_status_wc-pending_to_processing)
          没有这个action
          也就没有通过 woocommerce_order_status_pending_to_processing 来触发send_transactional_email()函数
          在拼接do_action前,我输出了 $old_status,就是有wc前缀的,从代码中没有看到对$old_status的处理,所以我就加了一个…

    1. 正常情况下do_action( ‘woocommerce_order_status_’ . $old_status . ‘_to_’ . $new_status, $this->id )中的$old_status就是pending,而不是wc-pending。所以我说可能是你代码别的地方有问题,导致了woocommerce给出错误结果。你想啊,人家会把status写成wc-pending再让别人用php字符串替换给去掉吗,这不是吃饱了撑着了。

  20. 大神,我的付款方式是“货到付款”,点击”下单“后,自动生成的订单,状态是 wc-processing 是”处理中“状态。
    请问,如何修改可以让”下单“是创建的订单状态默认为”wc-pending“ (待付款)状态。
    我在class-wc-checkout.php中找到了 creat order,这个function中默认就是”pending“状态,不知道为什么到订单创建好之后就变”wc-processing“了。

    1. cod的默认状态是processing,对应代码在includes/gateways/cod/class-wc-gateway-cod.php里,不知道哪个版本改的,之前应该是on-hold状态。
      你只能在thank you页面再次更新状态,像这样

      function custom_woocommerce_cod_status( $order_id ) { 
          if ( ! $order_id ) {
              return;
          }
      
          $order = wc_get_order( $order_id );
          if( $order->payment_method == 'cod' ){
          	$order->update_status( 'pending' );
          }
      }
      add_action( 'woocommerce_thankyou', 'custom_woocommerce_cod_status' );
      
      1. 多谢大神,我在includes/gateways/cod/class-wc-gateway-cod.php这里进行了修改
        $order->update_status( ‘pending’, __( ‘Payment to be made upon delivery.’, ‘woocommerce’ ) );
        把默认的processing 改为了 pending。
        这样就可以了。我不敢在thankyou页面改,我担心客户从”我的账户“中点进去”支付“或这thankyou页面刷新,导致订单状态始终为”待支付“。
        非常感谢!我找了一下午….

        1. 我想这个问题先判断下订单状态就能解决,当然你的方法没问题,既然你不怕更新的时候麻烦。

  21. 再问一个事,谷歌服务在国内不能用,那个google adsense在国内是正常的对吧?

    最近看到别人博客,会在文章末尾加个联盟连接(只是一个超链接,按点击次数付费,比如2345大联盟),说是2万IP千次60元起(这话我就没懂,是说点击1000次,60元起,那2万是啥玩意)。不知道,国外有没有类似的。

    1. google adsense在中国加载不快,虽然是异步加载,不影响别的内容,但体验也不是太好。
      至于联盟,我真没怎么玩过,“2万IP千次60元起”我也不懂,可能是2万次展示或者千次点击给60元吧。