对具有构造的类使用添加操作

时间:2018-10-19 作者:Alt C

我有我的答案,但似乎有很多人投了赞成票https://wordpress.stackexchange.com/a/48094/145078

但我不知道为什么它对我不起作用。。

作为回答

    class MyClass {
         function __construct() {
              add_action( \'init\',array( $this, \'getStuffDone\' ) );
         }
         function getStuffDone() {
              // .. This is where stuff gets done ..
         }
    }
    $var = new MyClass();
我不需要设置可见性吗?

namespace NS{
class MyClass {
     public function __construct() {
          add_action( \'init\',array( $this, \'getStuffDone\' ) );
     }
     public function getStuffDone() {
          // .. This is where stuff gets done ..
     }
}
}

$var = new MyClass();
以上代码不适用于我,是否正确或我方有任何错误?

但是这个代码很好用

add_action(\'init\',function(){
 $lat = new \\NS\\MyClass();
 $lat->getStuffDone(); //Sorry not $lath
});
我正在按要求调用类文件get\\u template\\u directory()/myfolder/class/MyClass。php

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

以上代码不适用于我,是否正确或我方有任何错误?

这对我也不起作用。因为它会引发以下致命错误:

PHP致命错误:在中的命名空间{}之外可能不存在任何代码。。。

这是因为PHPmanual 表示:

除了开头的declare语句外,命名空间括号外不能存在任何PHP代码。

因此,您的代码可以通过两种方式修复:

使用无括号语法。

<?php
namespace NS;

class MyClass {
     public function __construct() {
          add_action( \'init\',array( $this, \'getStuffDone\' ) );
     }
     public function getStuffDone() {
          // .. This is where stuff gets done ..
     }
}

$var = new MyClass();
输入全局代码(或$var = new MyClass();) 在命名空间语句中(namespace {}) 没有命名空间<请注意,您需要使用NS\\MyClass 而不仅仅是MyClass.

<?php
// No code here. (except `declare`)

namespace NS {

    class MyClass {
         public function __construct() {
              add_action( \'init\',array( $this, \'getStuffDone\' ) );
         }
         public function getStuffDone() {
              // .. This is where stuff gets done ..
         }
    }
}
// No code here. (except another `namespace {...}`)

namespace {
    $var = new NS\\MyClass();
}
// No code here. (except another `namespace {...}`)
更新好的,这就是我的wp-content/themes/my-theme/includes/MyClass.php:

<?php
namespace NS;

class MyClass {
     public function __construct() {
          add_action( \'init\', array( $this, \'getStuffDone\' ) );
          add_filter( \'the_content\', array( $this, \'test\' ) );
     }

     public function getStuffDone() {
          error_log( __METHOD__ . \' was called\' );
     }

     public function test( $content ) {
          return __METHOD__ . \' in the_content.<hr>\' . $content;
     }
}

$var = new MyClass();
我把wp-content/themes/my-theme/functions.php:

require_once get_template_directory() . \'/includes/MyClass.php\';
尝试一下,看看它是否对你有效,因为它对我很有效:

你会看到NS\\MyClass::test in the_content. 在帖子内容中(只需访问任何一篇帖子)。

你会看到NS\\MyClass::getStuffDone was called 添加到error_log 文件或wp-content/debug.log 如果已启用WP_DEBUG_LOG.

SO网友:phatskat

我不需要设置可见性吗

上述代码不适用于我,是否不正确或我有任何错误您的代码看起来很好。我注意到你们班使用admin_init 钩子,但您的闭包示例使用init. 记住admin_init 仅在WordPress admin中激发,而不在前端激发。您的代码可能没有在正确的时间连接,但这不太可能。

尝试以下操作:

class MyClass {
    public function __construct() {
    }

    public function hooks() {
        add_action( \'admin_init\', array( $this, \'doAdminTest\' ) );
        add_action( \'init\', array( $this, \'doGeneralTest\' ) );
    }

    public function doAdminTest() {
        die( \'We are in the admin area.\' );
    }

    public function doGeneralTest() {
        die( \'We are in the init hook.\' );
    }
}

$var = new MyClass();

add_action( \'plugins_loaded\', array( $var, \'hooks\' ) );
现在,如果您转到/wp admin/或您的前端,您应该会得到doGeneralTest. 如果您注释掉add_action 用于的行init, 您应该看到doAdminTest at/wp管理员/

结束

相关推荐

Generating a perfect loop

所以我现在已经在这里坐了大约三个小时了,我不得不让这件事过去几个小时来好好睡一觉,同时我希望能得到你的帮助。我已经能够使用$wpdb->get\\u results从数据库中获取内容,并且能够将它们放入一个数组中,但是我想使用这些信息在循环中运行一个新的查询,以获取列表中的多个项目。我使用了本指南的一个变体https://stackoverflow.com/questions/45848249/woocommerce-get-all-orders-for-a-product 获取订单ID。现在,我已